我正在编写一个 vanilla JavaScript 工具,启用后会向传递给它的每个元素添加事件侦听器。
我想做这样的事情:
var do_something = function (obj) {
// do something
};
for (var i = 0; i < arr.length; i++) {
arr[i].el.addEventListener('click', do_something(arr[i]));
}
不幸的是,这不起作用,因为据我所知, _在添加事件监听器时,参数只能传递给匿名函数_:
for (var i = 0; i < arr.length; i++) {
arr[i].el.addEventListener('click', function (arr[i]) {
// do something
});
}
问题是我需要能够在禁用该工具时删除事件侦听器,但我不认为可以使用匿名函数删除事件侦听器。
for (var i = 0; i < arr.length; i++) {
arr[i].el.removeEventListener('click', do_something);
}
我知道我可以轻松地使用 jQuery 来解决我的问题,但我正在尝试尽量减少依赖性。 jQuery 必须以某种方式解决这个问题,但代码有点混乱!
原文由 tomturton 发布,翻译遵循 CC BY-SA 4.0 许可协议
这是无效的:
侦听器必须是函数 _引用_。当您调用函数作为
addEventListener
的参数时,函数的返回值将被视为事件处理程序。您不能在分配侦听器时指定参数。处理程序函数将始终以event
作为第一个参数传递。要传递其他参数,您可以将处理程序包装到匿名事件侦听器函数中,如下所示:为了能够通过
removeEventListener
你只需命名处理函数:要访问处理程序函数中的其他变量,您可以使用闭包。例如: