一尘不染

如果删除了DOM元素,是否还将其侦听器也从内存中删除了?

javascript

如果删除了DOM元素,它的侦听器也会从内存中删除吗?


阅读 466

收藏
2020-04-25

共1个答案

一尘不染

现代浏览器

纯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()此方法看起来像这样,该方法会在从DOM中删除后自动清除与元素关联的所有数据/事件(通过是这样。remove()empty()html("")等等)。


较旧的浏览器

已知较旧的浏览器(尤其是IE的较旧版本)会出现内存泄漏问题,这是因为事件侦听器保留了对其所附加元素的引用。

2020-04-25