可以通过使其回调函数无效来删除EventListener吗?

时间:2014-06-23 10:17:40

标签: javascript firefox-addon

我想知道是否可以通过取消其回调函数来删除事件监听器?

简化示例:

var somefunction = function() {
  // some code
}
window.addEventListener(eventType, somefunction, false); 

现在,设置somefunction = null;会删除上面的EventListener,还是只是将它变成僵尸EventListener?

实际代码用于Firefox(覆盖式)Addon,我正在考虑(自动)删除unload事件上的EventListeners的替代方法,除了显而易见的事情:

window.removeEventListener(eventType, somefunction, false); 

更新:请注意,这是Firefox插件代码的一部分。此实例中的eventType为'popupshowing',它不能无效,因为它会破坏浏览器功能。

提前感谢您的帮助 期待(替代)建议

2 个答案:

答案 0 :(得分:2)

removeEventListener是要走的路。

此外,通过将某个变量设置为null,您实际上无效该功能。该变量仅指定了一个引用(对于非POD对象,如函数)。为了说明这一点,请考虑以下事项:

var a = function() { alert("called"); };
setTimeout(a, 1000); // Will still alert!

var b = a;

a = null; // What you called `nullify`....
console.log(this.a, "a" in this); // null, true
delete this.a; // Actually remove the property from the global scope.
// `a` is really dead at this point!

b(); // will still alert, too.

如果你想避免一些removeEventListener电话,我会使用一些辅助功能:

let { addEventListenerUnload, removeEventListenerUnload } = (function() {
  let tracked = [];
  addEventListener("unload", function removeTracked() {
    removeEventListener("unload", removeTracked);
    for (let t of tracked) {
      try {
        removeEventListener(t.type, t.fn, t.capture);
      }
      catch (ex) {}
    }
    tracked.length = 0;
  });
  return {
    addEventListenerUnload: function(type, fn, capture) {
      addEventListener(type, fn, capture);
      tracked.push({type: type, fn: fn, capture: capture});
    },
    removeEventListenerUnload: function(type, fn, capture) {
      tracked = tracked.filter(e => e.type != type || e.fn != fn || e.capture != capture);
      removeEventListener(type, fn, capture);
    }
  };
})();

(包括Firefox支持的一些ECMA-6内容,但您可以轻松转换。此外,可能根本不需要removeEventListenerUnload,因此您可以省略它。此外,在覆盖脚本中使用此功能时一定要给它唯一的名字,以避免与其他代码冲突。)

答案 1 :(得分:1)

我认为将回调函数设置为null将删除eventlistener,您仍然会附加eventlistener,您可以使用removeEventListener或将eventType设置为null,如:

window.eventType = null;