看起来没有人涵盖 JavaScript 规范的一部分,它现在为您提供了一种删除事件侦听器的机制没有使用removeEventListener。如果我们查看https://dom.spec.whatwg.org/#concept-event-listener,我们会发现在设置事件侦听器时有许多属性可以作为选项传递:
{
type (a string)
callback (an EventListener object, null by default)
capture (a boolean, false by default)
passive (a boolean, false by default)
once (a boolean, false by default)
signal (an AbortSignal object, null by default)
removed (a boolean for bookkeeping purposes, false by default)
}
现在,该列表中有很多有用的属性,但为了删除事件侦听器,我们要使用的是 signal 属性(已添加到 DOM 级别 3 in late 2020),因为它让我们告诉 JS 引擎通过使用 AbortController 删除事件侦听器,而不必费心保留对确切处理函数和侦听器选项的引用“因为否则 removeEventListener 甚至无法正常工作”:
const areaListener = new AbortController();
area.addEventListener(
`click`,
({clientX: x, clientY: y}) => {
app.addSpot(x, y);
app.addFlag = 1;
},
areaListener
);
(我们利用了 areaListener 等同于 { signal: ... } 对象这一事实,在任何其他事件侦听器选项属性中没有重叠)
现在,当需要删除该事件侦听器时,我们只需运行:
areaListener.abort()
完成:JS 引擎将中止并清理我们的事件侦听器。不保留对处理函数的引用,不确保我们调用 removeEventListener 时使用与我们调用 addEventListener 时完全相同的功能和属性:我们只是用一个无参数的中止调用取消监听器。
当然,还要注意,如果我们想这样做“因为我们只希望处理程序触发一次”,那么我们甚至不需要这样做, 我们可以只用 { once: true } 创建一个事件监听器,JS 会处理剩下的事情。无需删除代码。
area.addEventListener(
`click`,
() => app.bootstrapSomething(),
{ once: true }
);