在动态创建的元素上添加事件侦听器

jen*_*jis 46 javascript addeventlistener intercept dom-events

是否可以向所有动态生成的元素添加事件监听器(javascript)?我不是页面的所有者,所以我不能以静态方式添加监听器.

对于我使用的页面加载时创建的所有元素:

doc.body.addEventListener('click', function(e){
//my code
},true);
Run Code Online (Sandbox Code Playgroud)

我需要一个方法来在页面上出现新元素时调用此代码,但是我不能使用jQuery(委托,on等在我的项目中无法工作).我怎样才能做到这一点?

fou*_*ama 75

听起来你需要追求一个授权策略,而不会回到图书馆.我在这里发布了一些示例代码:http://jsfiddle.net/founddrama/ggMUn/

它的要点是使用对象target上的内容event来查找您感兴趣的元素,并做出相应的响应.就像是:

document.querySelector('body').addEventListener('click', function(event) {
  if (event.target.tagName.toLowerCase() === 'li') {
    // do your action on your 'li' or whatever it is you're listening for
  }
});
Run Code Online (Sandbox Code Playgroud)

CAVEATS!示例Fiddle仅包含符合标准的浏览器的代码(即IE9 +,几乎所有其他人的版本)如果您需要支持"旧IE" attachEvent,那么您还需要提供自己的自定义包装器.适当的原生功能.(关于这一点有很多很好的讨论;我喜欢Nicholas Zakas在他的书"Web开发人员的专业JavaScript"一书中提供的解决方案.)

  • 我想知道为什么不写`document.body`? (12认同)
  • @drinchev是的,那些都是等价的.在给出示例时,我更喜欢使用`document.querySelector()`版本,因为它更容易概括 - 即,不是每个元素都可以作为属性从`document`访问. (3认同)
  • @JianWeihang你能澄清一下你的问题吗?您不希望将元素直接应用于`body`元素(例如,作为`onclick`属性),否则冒着吹走已经存在的侦听器的风险.事件委派策略更安全:不太可能干扰或破坏元素上的其他侦听器,并且不太可能使用每个元素的侦听器占用内存. (2认同)

ATO*_*TOA 13

取决于您如何添加新元素.

如果你添加使用createElement,你可以试试这个:

var btn = document.createElement("button");
btn.addEventListener('click', masterEventHandler, false);
document.body.appendChild(btn);
Run Code Online (Sandbox Code Playgroud)

然后,您可以masterEventHandler()用来处理所有点击.