如果附加的函数是闭包,如何删除事件侦听器

How to remove event listener if the attached function is a closure?

本文关键字:何删除 删除 侦听器 事件 函数 闭包 如果      更新时间:2023-09-26

示例:

for (var i = 0 ; i < a.length ; i ++) {
    a[i].addEventListener("touchend", f(i));
}
function f(param) {
    return function() {
        for (var i = 0 ; i < a.length ; i ++) {
            a[i].removeEventListener("touchend", f(i));
        }
    }
}

它就是不起作用,我该怎么办?

为了调用.removeEventListener(),您必须保留对函数的引用。这意味着您必须为函数提供一个标识符,然后可以在.addEventListener().removeEventListener()中使用该标识符。符号可以是局部符号(不必是全局符号(,但您需要一个符号才能在两个地方都使用它。

如果你能更多地解释一下你试图用你显示的代码实现什么,以及你想在哪里使用.removeEventListener(),我们可能会就如何更改它提供一个更具体的建议(我不理解你试图用它做什么(。

也许是这样的:

var temp;
for (var i = 0 ; i < a.length ; i ++) {
    temp = f(i);
    a[i].touchEndHandler = temp;
    a[i].addEventListener("touchend", temp);
}

然后,过一段时间,你可以做:

x.removeEventListener("touchend", x.touchEndHandler);

或者,根据.removeEventListener()代码的位置,可以将函数引用保存在闭包变量中。