是否可以在不破坏后代事件侦听器的情况下追加到innerHTML?

是否可以在不破坏后代事件侦听器的情况下追加到innerHTML?

在下面的示例代码中,我附加了一个onclick包含文本“foo”的span的事件处理程序。处理程序是一个匿名函数,它将弹出alert().

但是,如果我分配给父节点的innerHTML,这个onclick事件处理程序被销毁-单击“foo”无法弹出警报框。

这个可以修好吗?

<html>
 <head>
 <script type="text/javascript">

  function start () {
    myspan = document.getElementById("myspan");
    myspan.onclick = function() { alert ("hi"); };

    mydiv = document.getElementById("mydiv");
    mydiv.innerHTML += "bar";
  }

 </script>
 </head>

 <body onload="start()">
   <div id="mydiv" style="border: solid red 2px">
     <span id="myspan">foo</span>
   </div>
 </body></html>


拉风的咖菲猫
浏览 360回答 3
3回答

HUX布斯

不幸的是,分配给innerHTML导致所有子元素的破坏,即使您试图追加。如果希望保留子节点(及其事件处理程序),则需要使用DOM函数:function&nbsp;start()&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;myspan&nbsp;=&nbsp;document.getElementById("myspan"); &nbsp;&nbsp;&nbsp;&nbsp;myspan.onclick&nbsp;=&nbsp;function()&nbsp;{&nbsp;alert&nbsp;("hi");&nbsp;}; &nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;mydiv&nbsp;=&nbsp;document.getElementById("mydiv"); &nbsp;&nbsp;&nbsp;&nbsp;mydiv.appendChild(document.createTextNode("bar"));}编辑:鲍勃的解决方案,从评论。发你的答案鲍勃!为它获得荣誉。*-)function&nbsp;start()&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;myspan&nbsp;=&nbsp;document.getElementById("myspan"); &nbsp;&nbsp;&nbsp;&nbsp;myspan.onclick&nbsp;=&nbsp;function()&nbsp;{&nbsp;alert&nbsp;("hi");&nbsp;}; &nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;mydiv&nbsp;=&nbsp;document.getElementById("mydiv"); &nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;newcontent&nbsp;=&nbsp;document.createElement('div'); &nbsp;&nbsp;&nbsp;&nbsp;newcontent.innerHTML&nbsp;=&nbsp;"bar"; &nbsp;&nbsp;&nbsp;&nbsp;while&nbsp;(newcontent.firstChild)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mydiv.appendChild(newcontent.firstChild); &nbsp;&nbsp;&nbsp;&nbsp;}}

三国纷争

现在是2012年了,jQuery的附加函数和前置函数正是这样做的,在不影响当前内容的情况下添加内容。非常有用。
打开App,查看更多内容
随时随地看视频慕课网APP