Javascript是否会删除已删除的DOM元素的事件处理程序?

22

如果我将一些事件附加到某些DOM元素,然后删除它们,那么其事件处理程序或其他属性使用的内存是否仍将被使用?

我之所以问这个问题,是因为我想知道,如果我通过AJAX请求不断地向页面上的某个区域添加新元素并绑定事件,只要有新的AJAX结果出现就会删除它们并重复这个过程,那么我是否会使用大量内存。


1
这不是一个直接的答案,但如果你不断地添加新元素和删除旧元素,我建议使用事件委托来处理事件。它完全避免了这个问题。 - RightSaidFred
话虽如此,如果可能的话,我会尝试找到重用元素而不是销毁和重新创建的方法。 - RightSaidFred
@RightSaidFred,是的 - 如果元素有任何关联,我可以使用委托重用大部分事件。然而,对于我来说,这些是完全不同的页面加载。 - Xeoncross
我认为这取决于浏览器。已删除的DOM元素的事件处理程序应该肯定有资格进行垃圾回收,但是较旧版本的IE可能存在内存泄漏的情况。 - Adam Rackis
@RightSaidFred,在我的情况下,加载的内容行为可能与先前占据页面该区域的内容完全不同。这就是为什么我想知道是否进行此操作是“内存安全”的原因 - 或者我需要刷新页面,以便在执行此操作20次或更多次后浏览器不会崩溃。 - Xeoncross
显示剩余4条评论
1个回答

8
现代浏览器会在 DOM 节点中使用的事件处理程序占用内存后(最终)释放。但是,旧版本的 Internet Explorer 不会释放该内存,因此在从 DOM 中移除节点之前删除事件监听器始终是一个好习惯。
阅读这篇文章可以更好地理解其中的问题:http://msdn.microsoft.com/en-us/library/bb250448(v=vs.85).aspx

7
小小的注释:IE 的错误行为与事件处理程序持有对它们所附加的元素的引用有关。 - Alexander Pavlov
3
该文章的出版日期为2005年6月。这个回答来自2011年。“旧版本的Internet Explorer”有点含糊不清,但我认为这可能意味着IE 8或更早版本,因为在2011年IE 9是最新的稳定版本。对我来说,这仍然是一个有些开放的问题... - user918510

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