我创建了简单的fidlle
var cnt = 1;
function add() {
var root = document.getElementById('root')
root.innerHTML += '<br /><a id= "a_' +cnt + '" href="#">click</a>'
var a = document.getElementById("a_"+cnt)
a.addEventListener('click', function(event) {
alert('click:a_'+cnt)
})
cnt++
}
添加新链接后点击添加按钮,点击此链接后会出现警告。
当使用“添加”按钮添加更多链接时,只有最后一个链接有效(其他链接根据开发工具没有点击事件侦听器)。
为什么只有最后一个链接有效,如何才能使所有链接正常工作?
答案 0 :(得分:6)
因为您要在html中重新插入锚标记。 问题类似于Appending HTML string to the DOM。
您可以使用
root.insertAdjacentHTML( 'beforeend', '<br /><a id= "a_' +cnt + '" href="#">click</a>');
而不是
root.innerHTML += '<br /><a id= "a_' +cnt + '" href="#">click</a>'
工作小提琴https://jsfiddle.net/0nm4uLvd/
为了改进答案,这里是另一个参考,为什么在删除dom元素时删除事件侦听器=&gt; If a DOM Element is removed, are its listeners also removed from memory? 感谢这些家伙:)
答案 1 :(得分:2)
您正在修改根元素的innerHTML。这将导致完整的根源&#39;要重新创建,所以只有新事件才能起作用。
请参阅Manipulating innerHTML removes the event handler of a child element?。
答案 2 :(得分:1)
在控制台中检查您的变量cnt。 你没有发布调用函数add的整个上下文,但我强烈猜测这个变量总是保持为1。
在你的cnt ++之后写一个分号
答案 3 :(得分:1)
您可以为链接设置课程:class =&#34; some-class&#34;。 然后你可以使用jquery来监听这个类的元素上的click事件。
$(document).on('click', '.some-class', function(event) {
alert('click:'+$(this).attr('id'));
});