如果移除了一个 DOM 元素,它的监听器是否也会从内存中移除?
纯 JavaScript
如果被移除的 DOM 元素是无引用的(没有指向它的引用),那么 是 的 - 元素本身被垃圾收集器以及与之关联的任何事件处理程序/侦听器拾取。
var a = document.createElement('div'); var b = document.createElement('p'); // Add event listeners to b etc... a.appendChild(b); a.removeChild(b); b = null; // A reference to 'b' no longer exists // Therefore the element and any event listeners attached to it are removed.
然而; 如果存在仍然指向所述元素的引用,则该元素及其事件侦听器将保留在内存中。
var a = document.createElement('div'); var b = document.createElement('p'); // Add event listeners to b etc... a.appendChild(b); a.removeChild(b); // A reference to 'b' still exists // Therefore the element and any associated event listeners are still retained.
jQuery
可以公平地假设 jQuery 中的相关方法(例如remove())将以完全相同的方式运行(考虑使用例如remove()编写)。removeChild()
remove()
removeChild()
然而, 这不是真的 ;jQuery 库实际上有一个内部方法(未记录,理论上可以随时更改)称为cleanData() (这是此方法的样子),它会在从 DOM 中删除时自动清理与元素关联的所有数据/事件(通过. remove(),empty()等html(""))。
cleanData()
empty()
html("")
较旧的浏览器 - 特别是较旧版本的 IE - 由于事件侦听器保持对它们所附加的元素的引用而存在内存泄漏问题。
如果您想更深入地了解用于修复旧版 IE 版本内存泄漏的原因、模式和解决方案,我完全建议您阅读 这篇 MSDN 文章,了解和解决 Internet Explorer 泄漏模式。
还有几篇与此相关的文章:
在这种情况下,自己手动删除侦听器可能是一个好习惯(仅当内存对您的应用程序至关重要并且您实际上是针对此类浏览器时)。