在dynamic创build的元素上添加事件监听器
是否有可能添加事件监听器(JavaScript)所有dynamic生成的元素? 我不是页面的所有者,所以我不能以静态的方式添加一个监听器。
对于我使用的页面加载时创build的所有元素:
doc.body.addEventListener('click', function(e){ //my code },true);
我需要一个方法来调用这个代码,当新的元素出现在页面上,但我不能使用jQuery(委托,上等不能在我的项目中工作)。 我怎样才能做到这一点?
这听起来像你需要追求一个代表团战略,而不会退回到图书馆。 我已经发布了一些示例代码在小提琴在这里: http : //jsfiddle.net/founddrama/ggMUn/
它的要点是使用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 } });
CAVEATS! 示例Fiddle只包含符合标准的浏览器的代码(即IE9 +,以及几乎所有其他版本的代码)。如果您需要支持“旧IE”的attachEvent
,那么您还需要提供自己的自定义封装正确的本地function。 (关于这方面有很多很好的讨论,我喜欢Nicholas Zakas在他的书“ Professional JavaScript for Web Developers”中提供的解决scheme。
取决于你如何添加新的元素。
如果你使用createElement
添加,你可以试试这个:
var btn = document.createElement("button"); btn.addEventListener('click', masterEventHandler, false); document.body.appendChild(btn);
然后,您可以使用masterEventHandler()
来处理所有的点击。
我创build了一个小函数添加dynamic事件侦听器,类似于jQuery.on()
。
它使用与接受的答案相同的思想,只是它使用Element.matches()
方法来检查目标是否匹配给定的select器string。
addDynamicEventListener(document.body, 'click', '.myClass, li', function (e) { console.log('Clicked', e.target.innerText); });
你可以从github得到。
如果你真的不想/不能使用jQuery或其他的JS库,你只剩下实现一个自动化的事件监听器添加到新添加的元素。
你可以想到的一种方法是,例如,覆盖HTMLElement.prototype.appendChild
甚至是JS中允许的document.createElement
方法。
然后,每当元素被添加/创build时,都可以做任何你需要的。
使用classList
属性一次绑定多个类
var container = document.getElementById("table"); container.classList.add("row", "oddrow", "firstrow");