这是.remove
当前 jQuery 版本 (1.6.2) 中的方法。请注意,它调用.cleanData
:
// keepData is for internal use only--do not document
remove: function( selector, keepData ) {
for ( var i = 0, elem; (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;
},
And the .cleanData
它调用的方法,其中提到了票号并据称防止了可怕的泄漏(根据其中一条评论):
cleanData: function( elems ) {
var data, id, cache = jQuery.cache, internalKey = jQuery.expando, special = jQuery.event.special,
deleteExpando = jQuery.support.deleteExpando;
for ( var i = 0, elem; (elem = elems[i]) != null; i++ ) {
if ( elem.nodeName && jQuery.noData[elem.nodeName.toLowerCase()] ) {
continue;
}
id = elem[ jQuery.expando ];
if ( id ) {
data = cache[ id ] && cache[ id ][ internalKey ];
if ( data && data.events ) {
for ( var type in data.events ) {
if ( special[ type ] ) {
jQuery.event.remove( elem, type );
// This is a shortcut to avoid jQuery.event.remove's overhead
} else {
jQuery.removeEvent( elem, type, data.handle );
}
}
// Null the DOM reference to avoid IE6/7/8 leak (#7054)
if ( data.handle ) {
data.handle.elem = null;
}
}
if ( deleteExpando ) {
delete elem[ jQuery.expando ];
} else if ( elem.removeAttribute ) {
elem.removeAttribute( jQuery.expando );
}
delete cache[ id ];
}
}
}
这是评论中提到的票。显然八个月前就已经修复了:
http://bugs.jquery.com/ticket/7054#comment:10 http://bugs.jquery.com/ticket/7054#comment:10
根据 Dave Methvin 的说法,解决方案似乎是确保事件处理程序中的 DOM 元素引用被 cleanData 删除,以避免 IE6/7/8 内存泄漏。
换句话说,将事件处理程序中对 DOM 元素的引用设置为null
否则一些很棒的浏览器,无需提及任何名称cough IE cough会泄漏内存。
discardElement
(来自您的链接)将元素插入容器中,然后清空容器,从而无效化对该元素的任何引用。
考虑到这一点,我建议升级 jQuery。您指向的文章是 2009 年的,两年大约相当于 jQuery 开发时间的四百多个工时。
最后,这里有一些关于 Internet Explorer 中泄漏模式的有趣(而且长得可笑)的读物:
- 了解和解决 Internet Explorer 泄漏模式 http://msdn.microsoft.com/en-us/library/bb250448%28v=vs.85%29.aspx