我目前正在学习DOM并遇到这个问题,当两个或多个克隆元素获得相同的事件监听器时,我正在努力解决这个问题。
case 116:
var myList = document.querySelectorAll(".selected");
for(var i=0; i<myList.length;i++)
{
var node=myList[i].cloneNode(true);
node.style.top=Math.random()*window.innerHeight-(node.style.height/2)+"px";
node.style.left=Math.random()*window.innerWidth-(node.style.width/2)+"px";
node.addEventListener("click",function(e){
node.classList.toggle("selected");
console.log(e);
});
myList[i].parentNode.appendChild(node);
}
break;
框1是原始框,它有自己的EventListener。
方框2是原文的克隆,并按原样选择和取消选择。
方框3-4是1-2的克隆,但是看起来方框3和4得到了相同的监听器,因为当我点击时 方框4它在方框3上选择切换,方框4没有任何反应。
我该如何解决这个问题?
欢迎任何帮助。
答案 0 :(得分:1)
我认为这是一个范围问题。您的事件处理程序正在引用node
,但在循环结束时,node
将指向最后创建的方块。您可以使用闭包为每个事件处理程序存储node
的值:
(function(node) {
// 'node' defined here is in it's own scope, so won't be affected by the changes
// made to the 'node' variable defined in the outer scope of the loop.
node.addEventListener("click",function(e){
node.classList.toggle("selected");
console.log(e);
});
})(node);
但可能更好的解决方案是在事件处理程序中使用this
:
node.addEventListener("click",function(e){
// within an event handler, 'this' references the event's target element
this.classList.toggle("selected");
console.log(e);
});