使用闭包添加的removeEventListener如何移除?

12

这基本上是这个问题的后续问题:Can't pass event to addEventListener: closure issue

我已经阅读了几乎所有相关的问题,但找不到答案。

下面的函数在循环中执行,其中参数从数据数组中提取。 通过这个函数,我能够将不同/新的参数传递给每个事件侦听器实例。outerfunction允许将参数的值封装在闭包中,以便实际值可用,而不仅仅是持有者的引用。此外,passeventfunction将事件传递给responsefunction。最后,responsefunction具有响应单击事件所需的所有适当信息。这非常好用。 问题是,我无法弄清楚如何在以后的时间删除事件侦听器。我已经尝试了我能想到的一切。请帮帮我。如何:removeEventListener?

(function outerfunction(i, f) {
     elementname.addEventListener("click", function passeventfunction(e) { 
         responsefunction(e, f, i); });})(parameter1, parameter2);

此外,如果有人能帮助澄清这里正在发生的事情。这是闭包中的闭包吗?有留下内存泄漏或其他问题的危险吗?


你需要在某个地方保存passeventfunction的引用,这样才能将其传递到removeEventListener中。 - Bergi
1个回答

14

你必须保留对听众的引用:

var listeners = {};
for(/* ... */) {
   (function outerfunction(i, f) {
        var listener = function(e) { 
            responsefunction(e, f, i); 
        }
        elementname.addEventListener("click", listener);
        listeners[elementname.id] = listener; // use something meaningful 
                                              // as your keys
   })(parameter1, parameter2);
}

// Removing the listener later:
elementname.removeEventListener("click", listeners[elementname.id]);

4
我建议使用 Map 而不是通用对象,因为你可以将元素本身用作 Map 中的键,而通用对象只接受字符串作为键。 - bpossolo
6
好的,那将是一个不错的改进。请注意,我是在2013年写的,当时地图还没有普及。 - bfavaretto
1
如果你们中的bfavaretto或@bpossolo能够使用模拟所接受答案的Map来回答这个特定问题,那将是对这个问答的极大补充(我将永远感激不尽!)。我已经了解到足够的知识,知道这就是我想要做的事情,并且已经阅读了相关资料,但是找不到一个能够帮助我理清细节的例子。 - Brandon

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接