是否有可能附加到innerHTML而不破坏后代的事件侦听器? [英] Is it possible to append to innerHTML without destroying descendants' event listeners?

查看:111
本文介绍了是否有可能附加到innerHTML而不破坏后代的事件侦听器?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

在以下示例代码中,我将 onclick 事件处理程序附加到包含文本foo的跨度。这个处理程序是一个匿名函数,它会弹出alert()。

In the following example code, I attach an onclick event handler to the span containing the text "foo". The handler is an anonymous function that pops up an alert().

但是,如果我将父元素赋值给 innerHTML ,这个 onclick 事件处理程序被破坏 - 点击foo无法弹出警告框。

However, if I assign to the parent node's innerHTML, this onclick event handler gets destroyed - clicking "foo" fails to pop up the alert box.

这是可以修复的吗?

<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>


推荐答案

不幸的是,赋值给 innerHTML 会导致所有子元素的破坏,即使您试图追加。如果要保留子节点(及其事件处理程序),则需要使用 DOM函数

Unfortunately, assignment to innerHTML causes the destruction of all child elements, even if you're trying to append. If you want to preserve child nodes (and their event handlers), you'll need to use DOM functions:

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

    var mydiv = document.getElementById("mydiv");
    mydiv.appendChild(document.createTextNode("bar"));
}

编辑: Bob的解决方案,来自评论。发布你的答案,鲍勃!为此获得荣誉。 : - )

Bob's solution, from the comments. Post your answer, Bob! Get credit for it. :-)

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

    var mydiv = document.getElementById("mydiv");
    var newcontent = document.createElement('div');
    newcontent.innerHTML = "bar";

    while (newcontent.firstChild) {
        mydiv.appendChild(newcontent.firstChild);
    }
}

这篇关于是否有可能附加到innerHTML而不破坏后代的事件侦听器?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆