看起来没有人涵盖了DOM规范的这一部分(浏览器和Node.js都实现了),它现在提供了一种机制,可以在不使用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
属性(它在2020年末添加到DOM级别3中),因为它让我们可以使用AbortController来移除事件监听器,而不必去麻烦地保留对确切处理函数和监听器选项的引用,“否则removeEventListener
甚至都无法正常工作”:
const areaListener = new AbortController();
area.addEventListener(
`click`,
({clientX: x, clientY: y}) => {
app.addSpot(x, y);
app.addFlag = 1;
},
{ signal: areaListener.signal }
);
现在,当我们需要移除事件监听器时,只需运行:
areaListener.abort()
好了:JS引擎将中止并清除我们的事件监听器。无需保留对处理函数的引用,也无需确保我们调用removeEventListener
时使用与所调用addEventListener
相同的函数和属性:我们只需通过单个、无参数的中止调用取消监听器。
当然,如果我们想要这样做“因为我们只想让处理程序触发一次”,那么我们甚至不需要这样做,我们可以使用{ once: true }
创建一个事件监听器,JS会处理其余事项。无需删除代码。
area.addEventListener(
`click`,
() => app.bootstrapSomething(),
{ once: true }
);