为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

拉风的咖菲猫 2019-06-18 13:00:46
是否可以在不破坏后代事件侦听器的情况下追加到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>
查看完整描述

3 回答

?
HUX布斯

TA贡献1876条经验 获得超6个赞

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

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

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

编辑:鲍勃的解决方案,从评论。发你的答案鲍勃!为它获得荣誉。*-)

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);
    }}


查看完整回答
反对 回复 2019-06-18
?
三国纷争

TA贡献1804条经验 获得超7个赞

现在是2012年了,jQuery的附加函数和前置函数正是这样做的,在不影响当前内容的情况下添加内容。非常有用。


查看完整回答
反对 回复 2019-06-18
  • 3 回答
  • 0 关注
  • 359 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信