Javascript- removeEventListener不应用于数组,从之前的addEventListener添加
Javascript- removeEventListener not applied to array, from previous addEventListener added with for loop
我已经对这个问题进行了很多思考和故障排除,但无法看到错误在哪里。
我有一些代码,添加一个点击事件监听器到一堆div。使用for
循环添加事件侦听器,该循环按预期应用。
然后,在使用了单击事件之后,我想删除事件侦听器,使用另一个for
循环,令人惊讶的是它不起作用。
这是我的js代码:
var divElems = document.querySelectorAll(".circle");
for(var i=0; i < divElems.length; i++) {
divElems[i].addEventListener("click", circleClicked(i), false);
}
... // perform actions with click
function circleClicked(i) {
return function(){
console.log("Clicked circle " + i);
};
}
...
function removeEvListener() {
for(var i=0; i < divElems.length; i++) {
divElems[i].removeEventListener("click", circleClicked(i), false);
}
}
应该应用于这个html:
<div class="container">
<div class="circle">Circle 1</div>
<div class="circle">Circle 2</div>
<div class="circle">Circle 3</div>
<div class="circle">Circle 4</div>
<div class="circle">Circle 5</div>
<div class="circle">Circle 6</div>
<div class="circle">Circle 7</div>
<div class="circle">Circle 8</div>
<div class="circle">Circle 9</div>
<div class="circle empty"></div>
<div class="circle empty"></div>
</div>
removeEvListener
函数在代码中作为回调应用,作为选项对象的一部分:{option1: "value1", option2: value2, onComplete: removeEvListener}
我试着只使用参考,也用括号removeEvListener()
,不工作。
添加到事件侦听器的函数接受与索引相关的输入,索引用于标识被单击的实际div。
请帮忙!
这是因为removeEventListener
引用了事件处理程序函数。在您的示例中,函数circleClicked
每次调用时都会创建一个新函数,因此您不能将其传递给removeEventListener
。
有两个解决方案:
- 将对事件侦听器的引用存储在数组中(丑) 创建一些更通用的事件处理程序。如果确实需要访问元素的索引,可以将其存储在
data-
属性中。或者按需计算。//编辑
divElems
包含所有可单击的元素,因此在单击处理程序中,您可以只检查被单击元素的索引。为了能够轻松地处理这个问题,您可以将NodeList divElems
转换为数组
var divElementsArray = Array.prototype.slice.call(divElems);
function clickHandler(e) {
// e parameter is the click event object,
// it has currentTarget property which would be a reference to the div element
var index = divElementsArray.indexOf(e.currentTarget);
console.log("Clicked circle's index: " + index);
}
相关文章:
- 没有找到相关文章