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

时间:2015-07-07 03:02:38

标签: javascript closures

示例:

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));
        }
    }
}

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

1 个答案:

答案 0 :(得分:2)

要调用.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()代码的位置,您可以将函数引用保存在闭包变量中。