我想知道是否可以通过取消其回调函数来删除事件监听器?
简化示例:
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'
,它不能无效,因为它会破坏浏览器功能。
提前感谢您的帮助 期待(替代)建议
答案 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;