javascript - 如果移除了一个 DOM 元素,它的监听器是否也会从内存中移除?

标签 javascript jquery dom memory memory-leaks

如果一个 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() 例如)。

但是,这不是真的; jQuery 库实际上有一个名为 cleanData() (here is what this method looks like 的内部方法(未记录,理论上可以随时更改) ) 在从 DOM 中删除时自动清除与元素关联的所有数据/事件(通过 remove()empty()html ("") 等)。


旧版浏览器

旧版浏览器(尤其是旧版 IE)已知会存在内存泄漏问题,因为事件监听器会保留对它们附加到的元素的引用。

如果您想更深入地了解用于修复旧版 IE 版本内存泄漏的原因、模式和解决方案,我完全建议您阅读 this MSDN article on Understanding and Solving Internet Explorer Leak Patterns.

还有几篇与此相关的文章:

在这种情况下,自己手动删除监听器可能是一个好习惯(仅当内存对您的应用程序至关重要并且您实际上是针对此类浏览器时)。

关于javascript - 如果移除了一个 DOM 元素,它的监听器是否也会从内存中移除?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12528049/

相关文章:

javascript - 如何在运行时创建多个切换?

php - 带警报的 AJAX 提交功能不起作用

javascript - Vanilla Javascript : Find a data attribute of the same name as an element given its id

javascript - Node 调度程序在 Node 服务器崩溃时销毁任务

javascript - 无法将 API 连接到 Chrome 扩展程序

javascript - 在函数中使用动态导入时,如何在全局变量中指定类型信息?

jquery - 如何在 Ajax 请求中使用 DELETE 动词

javascript - 使用 jQuery 获取单选按钮 ID

javascript - 当获取靠近文档边框的选定文本的边界矩形时,ie/edge 会出现奇怪的结果

java - 将 DOM 解析器更改为不对空节点使用短符号