# 关于移除匿名函数事件监听
通常移除EventTarget.addEventListener(type, listener, options?)
事件绑定,需要调用EventTarget.removeEventListener
并提供三个相同的参数(其中可选参数options/useCapture
只有useCapture
必须保持一致),才能移除成功。当我们的listener
是匿名函数的时候怎么移除呢?
# 头铁的解决方案
EventTarget.prototype.betterAddEventListener = function(type,fn,options){
this.addEventListener(type,fn,options);
return ()=>{
this.removeEventListener(type,fn,options)
}
}
// eg:
const cancel = window.betterAddEventListener('scroll',_=>{
console.log('trigger scroll')
})
cancel() // 取消监听
这样保证了参数的一致性,可以做到取消,但是不到万不得已的情况下是不能污染原生原型链的
。
# 未来的解决方案(兼容性不足)
const controller = new AbortController();
window.addEventListener("click", () => alert("window"), { signal: controller.signal });
document.addEventListener("click", () => alert("document"), { signal: controller.signal });
// 批量取消监听
controller.abort();
// 还可以定时取消
const signal = AbortSignal.timeout(3000);
// 3秒钟后自动失效
window.addEventListener("click", () => alert("window"), { signal });
不过兼容性堪忧 具体见 (opens new window)