我应该总是使用removeEventListener吗?

16

假设我像下面这样为窗口添加一个load事件:

window.addEventListener("load",initialize);

那我是否应该在事件触发后从窗口中移除load事件监听器呢?它只会触发一次,但它会在此之后继续监听吗?

这很简单:

function initialize(event_){
    /* Just by adding this line. */
    window.removeEventListener("load",initialize);
}

但是这是否过度了,或者这样做是否真正有利于我的程序性能?我只是问一下,因为“load”事件只会触发一次,所以如果它自己解决了就有道理了。虽然我从未听说过自行解决的侦听器... 有什么想法吗?

编辑:另外,我不关心特定的“load”事件,只关心监听器继续监听只会触发一次的事件的一般情况。


如果您对这种方法不确定,为什么不尝试 window.onload=initialize; 呢?这将调用您的初始化函数,但不会继续作为事件侦听器。我看不出删除加载事件侦听器的任何理由,但我只是提供另一种选项/方法,但两者都会做同样的事情。 - NewToJS
1
没有必要这样做。(@NewToJS ?? 设置windowonload属性只是另一种建立事件处理程序的方式。) - Pointy
@Pointy 我明白,我只是分享另一种触发它的方法,但正如你所指出的,没有任何理由删除该事件。 - NewToJS
我并不太关心实际的负载事件,只关注移除监听器的具体情境,以及监听器在事后是否会继续监听仅触发一次的事件。 - Frank
2个回答

21

window.addEventListener('load', initialize, {once: true});

可以翻译为:在窗口加载完毕后,只执行一次初始化函数,可使用以下代码实现。

2
你能否在答案中包含一些解释? - Ricardo Pontual
1
这个主题有一篇很好的文章(特别是最后一个例子)https://developers.google.com/web/updates/2016/10/addeventlistener-once - daGo
3
自从我发现了这个新功能,我经常使用它。 { once:true } 只是告诉事件监听器仅侦听一次事件,之后就会自动移除。 - Frank
2
在2020年,我了解到了once - Adam Jenkins

8

那么在事件被触发后,我应该从窗口中移除load事件监听器吗?

我从未见过这样做,所以我认为没有真正的需要。

它只会触发一次,但在此之后它还会继续监听吗?

DOM只会触发一次,是的。但它将继续监听,您可以轻松地手动触发load事件(请参阅MDN示例)。

但这是否有些过度设计或者实际上对我的程序有益呢?

通常情况下,这是过度设计,因为这并没有太大的区别。当然,它可能会在initialize上触发垃圾回收,这可能会节省一些内存(或更多,具体取决于代码结构),并通过使其对整个应用程序可用来提高性能。


2
我认为人们听到“监听”这个术语时会感到困惑,因为实际上没有人在“听”(主动意义上)任何东西。当您注册事件处理程序时,所有您所做的就是将一个函数附加到一个数组中(在幕后)。当事件触发时,它只是检查该数组并调用其中的每个函数,因此与循环和检查是否发生了某些事情相比,这是一个巨大的收益。因此,从那里删除处理程序只是使该列表的大小变小。这确实释放了一些内存,但正如您所说,这有点过度工程化。 - Marius Mucenicu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接