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

Wil*_*ith 9 javascript closures javascript-events addeventlistener

这基本上是一个后续问题:无法将事件传递给addEventListener:closure问题.

我已阅读几乎所有相关问题,但无法找到答案.

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

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

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

bfa*_*tto 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]);
Run Code Online (Sandbox Code Playgroud)

  • 我建议使用 Map 而不是通用对象,因为您可以使用元素本身作为 Map 中的键,而通用对象只接受字符串作为键。 (4认同)
  • 是的,这将是一个很好的改进.请注意,我在2013年写了这篇文章,当时地图尚未成为现实. (4认同)