javascript - 添加事件监听器,for(),索引。如何使用闭包?

标签 javascript for-loop closures addeventlistener

<分区>

我有这个代码:

var items = this.llistat.getElementsByTagName('a');

for( var i = 0; i < items.length; i++ ){    
  items[i].addEventListener('click', function(event) {
    alert( i );
  }, items[i]);
}

事件被监听,但有 3 项并且警报始终在任何元素上打印 3(它不考虑索引),

难道 items[i] 不应该作为闭包来完成工作吗?

谢谢!

最佳答案

不,addEventListener 的第三个参数是 useCapture 参数。参见 MDN获取更多信息。

但是你可以使用:

for( var i = 0; i < items.length; i++ ){
    (function(i){
        items[i].addEventListener('click', function(event) {
            alert( i );
        }, false);
    })(i);
}

var handler = function(event) {
    var i = items.indexOf(this);
    alert( i );
};
for( var i = 0; i < items.length; i++ ){
    items[i].addEventListener('click', handler, false);
}

第一个为每个元素创建一个新的事件处理程序,因此它需要更多内存。第二个重用相同的事件监听器,但使用 indexOf,因此速度较慢。

关于javascript - 添加事件监听器,for(),索引。如何使用闭包?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20587714/

相关文章:

javascript - 将调用函数添加到一个对象的所有字符串

javascript - 请简单解释我何时/为什么需要使用 bind()

java - for-each 不适用于表达式类型所需的数组或 java.lang.iterable

javascript - 可能是另一个闭环问题

rust - 在字符串上创建闭包返回迭代器

javascript - 使用EChart.JS绘制水平目标线

php - 如何将 PHP 变量值分配给 JavaScript 变量

windows - 批处理脚本不适用于 .bat 文件

templates - 动态 Mandrill 模板是否支持对集合进行迭代?

python - 递归闭包(函数发生器)