Когда вы вызываете .remove()
(или .empty()
), обработчики событий удаляются, вы не теряете память (по крайней мере, из этого, или есть другая ошибкав игре).
Вот что происходит ( в источнике тока ):
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;
}
Важной частью является этот бит:
jQuery.cleanData( elem.getElementsByTagName("*") );
jQuery.cleanData( [ elem ] );
Он запускает cleanData()
на любых дочерних элементах и самих элементах, удаляет данные и события из $.cache
, что очищает память, которую они использовали, и внутренне вызывает jQuery.event.remove()
, который очищает обработчики событий индивидуально.