我有这个代码:
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
,因此速度较慢。