如何删除使用闭包添加的EventListener?

时间:2013-11-04 18:08:50

标签: javascript javascript-events closures addeventlistener

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

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

以下函数在循环中执行,其中参数从数据数组中提取。 使用此函数,我可以将不同/新参数传递给事件侦听器的每个实例。 outer函数允许将参数的值封装在闭包中,以便实际值可用,而不仅仅是对持有者的引用。此外,passevent功能将事件传递给响应函数。最后,响应函数具有所有适当的信息以响应click事件。这非常有效。 问题是,我无法弄清楚如何在以后删除事件监听器。我已经尝试了所有我能想到的东西。请帮忙。我该怎么做:removeEventListener?

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

另外,如果有人可以帮助澄清这里发生的事情。这是封闭内的闭包吗?是否有留下内存泄漏的危险?谢谢!

1 个答案:

答案 0 :(得分:11)

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

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