现代浏览器
纯JavaScript
如果被删除的DOM元素是无引用的(没有指向它的引用),那么yes – 该元素本身被垃圾收集器以及与其相关联的任何事件处理器/监听器拾取。
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())将以完全相同的方式运行(考虑使用removeChild()写入remove())。
然而,这不是真的; jQuery库实际上有一个内部方法(它是无证的,并且理论上可以随时更改),称为cleanData()(here is what this method looks like),该方法在从DOM中删除时自动清理所有与一个元素相关的数据/事件(通过。remove(),empty(),html(“”)等)。
旧版浏览器
早期的浏览器 – 特别是IE的旧版本 – 已知存在内存泄漏问题,因为事件侦听器保持对其附加的元素的引用。
还有一些与此相关的文章:
在这种情况下手动删除侦听器可能是一个很好的习惯(只有内存对于你的应用程序是至关重要的,你实际上是针对这样的浏览器)。