Answers:
纯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的较旧版本)会出现内存泄漏问题,这是因为事件侦听器保留了对其所附加元素的引用。
如果您想更深入地解释用于解决旧版IE版本内存泄漏的原因,模式和解决方案,我完全建议您阅读此MSDN文章,了解和解决Internet Explorer泄漏模式。
一些与此相关的文章:
在这种情况下,您自己可以手动删除监听器,这可能是一个好习惯(仅当内存对于您的应用程序至关重要,而您实际上是针对此类浏览器的时候)。
remove
方法时。大多数情况下,DOM只会被完全擦除。(例如涡轮链接等)。我想知道如果我这样做document.body.innerHTML = ''
关于jQuery:
.remove()方法将元素移出DOM。要删除元素本身以及其中的所有内容时,请使用.remove()。除了元素本身之外,所有绑定的事件和与元素相关联的jQuery数据都将被删除。要删除元素而不删除数据和事件,请改用.detach()。
参考:http : //api.jquery.com/remove/
jQuery v1.8.2 .remove()
源代码:
remove: function( selector, keepData ) {
var elem,
i = 0;
for ( ; (elem = this[i]) != null; i++ ) {
if ( !selector || jQuery.filter( selector, [ elem ] ).length ) {
if ( !keepData && elem.nodeType === 1 ) {
jQuery.cleanData( elem.getElementsByTagName("*") );
jQuery.cleanData( [ elem ] );
}
if ( elem.parentNode ) {
elem.parentNode.removeChild( elem );
}
}
}
return this;
}
显然jQuery使用 node.removeChild()
据此:https : //developer.mozilla.org/en-US/docs/DOM/Node.removeChild,
The removed child node still exists in memory, but is no longer part of the DOM. You may reuse the removed node later in your code, via the oldChild object reference.
即事件监听器可能会被删除,但node
仍存在于内存中。
removeChild
。两者都还为您提供了一个参考,您可以保留该参考以重新附加后者(在这种情况下,它显然保留在内存中)或抛出方式(在这种情况下,它最终会被GC拾取并删除)。
只是扩展其他答案...
委派的事件处理程序将在元素删除后也不会被删除。
$('body').on('click', '#someEl', function (event){
console.log(event);
});
$('#someEL').remove(); // removing the element from DOM
现在检查:
$._data(document.body, 'events');