Ответ 1
Это метод .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;
},
И метод .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 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
Согласно Дэйву Метвину, решение, похоже, состоит в том, чтобы убедиться, что элемент DOM-элемента ref в обработчике события удален cleanData, чтобы избежать утечки памяти IE6/7/8.
Другими словами, установите ссылки на элементы DOM в обработчиках событий на null
, в противном случае некоторые удивительные браузеры, не упоминая какие-либо имена, кашель IE кашлят, будет утечка памяти.
discardElement
(из вашей ссылки) вставляет элемент в контейнер и затем опустошает контейнер, тем самым сводя на нет любые ссылки на этот элемент.
С учетом этого я предлагаю обновить jQuery. Статья, на которую вы указываете, относится к 2009 году, а два года примерно эквивалентна времени разработки jQuery в четыреста миллионов человеко-часов.
Наконец, вот некоторые интересные (и смехотворно длинные) показания об утечках в Internet Explorer: