我应该在删除子元素之前从元素中删除事件处理程序吗?

9

假设我有一个元素,如 <img id="foo" /> 并且已经附加了一些事件,例如 click(不是内联的 onclick!)

// somewhere i wrote
foo.addEventListener("click", clickHandler, false);
...
// somewhere i will write
foo.parentNode.removeChild(foo);

我需要删除所有事件吗?

2个回答

13
jQuery 的 empty() 方法文档 中指出:

为了避免内存泄漏,jQuery 在删除子元素之前会删除其他构造(如数据和事件处理程序)。

所以:1)如果我们没有显式地删除事件处理程序,就会发生内存泄漏;2)通过使用 empty() 方法,我们可以避免内存泄漏。

还可参见此问题的讨论。


7

从DOM中删除元素不会(或不应该)删除任何监听器;毕竟,您可能正在重新排列DOM元素的过程中,因此您不想丢弃任何监听器。

您可以在之前或之后删除监听器,这应该没有任何区别。

如果您计划删除元素并不再使用它们,则最好先删除事件以避免任何可能的内存泄漏。


@qeremy 你遇到了哪些问题? - Sampson
3
内存泄漏怎么办?当节点明显被丢弃时,是否解除事件绑定并不重要? - Rob W
1
从这个答案中并不完全清楚是否需要删除事件处理程序。也许在浏览器不再由任何变量引用之后,它们会被隐式地删除? - Ja͢ck
@JonathanSampson,这是我对英语理解有误导致的误会,没关系。 :) - Kerem
1
@RobW 如果我要将引用设置为null,我可能会在这样做之前删除任何绑定的监听器。目前我没有任何数据或引用来支持这一点 - 我只是一个多年来一直在与这些浏览器斗争的多疑开发者。 - Sampson
显示剩余4条评论

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