【问题标题】:addEventListener gone after appending innerHTMLaddEventListener 在附加 innerHTML 后消失了
【发布时间】:2011-02-10 17:08:03
【问题描述】:

好的,所以我使用 javascript/greasemonkey 将以下 html 添加到网站。 (只是示例)

<ul>
 <li><a id='abc'>HEllo</a></li>
 <li><a id='xyz'>Hello</a></li>
</ul>

我还为元素添加了一个点击事件监听器。 到目前为止一切正常,当我点击元素时点击事件被触发。

但是...我在脚本中有另一个函数,它在特定条件下修改该 html, 即它附加它,所以它看起来像:

<ul>
 <li><a id='abc'>Hello</a></li>
 <li><a id='xyz'>Hello</a></li>
 <li><a id='123'>Hello</a></li>
</ul>

但是完成后,它会破坏我为前两个元素添加的侦听器... 当我点击它们时没有任何反应。

如果我注释掉对执行附加的函数的调用,一切都会重新开始工作!

请帮忙...

【问题讨论】:

  • 你的问题可能出在你的javascript中。你能把它贴在这里让我们看看发生了什么吗?
  • 追加新html的函数是:var menu = pmgroot.getElementsByTagName("ul")[0]; menu.innerHTML += <the new html>(它很长,所以我懒得放在这里)</the>

标签: javascript innerhtml addeventlistener


【解决方案1】:

任何时候你设置innerHTML 属性,你都会覆盖之前在那里设置的任何HTML。这包括串联赋值,因为

element.innerHTML += '<b>Hello</b>';

和写一样

element.innerHTML = element.innerHTML + '<b>Hello</b>';

这意味着所有未通过 HTML 属性附加的处理程序都将被“分离”,因为它们附加到的元素不再存在,而一组新的元素已取而代之。要保留所有以前的事件处理程序,您必须在不覆盖任何以前的 HTML 的情况下附加元素。最好的方法是使用 DOM 创建函数,例如 createElementappendChild

var menu = pmgroot.getElementsByTagName("ul")[0];
var aEl  = document.createElement("a");
aEl.innerHTML = "Hello";
aEl.id "123";
menu.appendChild(aEl);

【讨论】:

  • 是的,工作就像一个魅力 :) 再次感谢 Andy 和 Jage,感谢它;)
【解决方案2】:

作为一个变体,你可以添加这样的 html,它可以在没有 addEventListener 的情况下工作:

<ul>
 <li><a id='abc' onclick='myFunc()'>Hello</a></li>
 <li><a id='xyz' onclick='myFunc()'>Hello</a></li>

 // The following add dynamically
 <li><a id='123' onclick='myFunc()'>Hello</a></li>
</ul>

【讨论】:

    【解决方案3】:

    你也可以使用jQuery的'live'函数

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-12-28
      • 2019-04-07
      • 1970-01-01
      • 2017-04-05
      • 1970-01-01
      • 2014-01-22
      • 1970-01-01
      • 2020-03-17
      相关资源
      最近更新 更多