Overhauled the .remove() and .empty() methods to be much more efficient. Fixes bug #4222.
This commit is contained in:
parent
48164ee603
commit
cb3f842c88
1 changed files with 21 additions and 8 deletions
29
src/core.js
29
src/core.js
|
@ -1225,23 +1225,27 @@ jQuery.each({
|
|||
|
||||
remove: function( selector ) {
|
||||
if ( !selector || jQuery.multiFilter( selector, [ this ] ).length ) {
|
||||
// Prevent memory leaks
|
||||
jQuery( "*", this ).add([this]).each(function(){
|
||||
jQuery.event.remove(this);
|
||||
jQuery.removeData(this);
|
||||
});
|
||||
if (this.parentNode)
|
||||
if ( this.nodeType === 1 ) {
|
||||
cleanData( this.getElementsByTagName("*") );
|
||||
cleanData( [this] );
|
||||
}
|
||||
|
||||
if ( this.parentNode ) {
|
||||
this.parentNode.removeChild( this );
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
empty: function() {
|
||||
// Remove element nodes and prevent memory leaks
|
||||
jQuery(this).children().remove();
|
||||
if ( this.nodeType === 1 ) {
|
||||
cleanData( this.getElementsByTagName("*") );
|
||||
}
|
||||
|
||||
// Remove any remaining nodes
|
||||
while ( this.firstChild )
|
||||
while ( this.firstChild ) {
|
||||
this.removeChild( this.firstChild );
|
||||
}
|
||||
}
|
||||
}, function(name, fn){
|
||||
jQuery.fn[ name ] = function(){
|
||||
|
@ -1249,6 +1253,15 @@ jQuery.each({
|
|||
};
|
||||
});
|
||||
|
||||
function cleanData( elems ) {
|
||||
for ( var i = 0, l = elems.length; i < l; i++ ) {
|
||||
var id = elems[i][expando];
|
||||
if ( id ) {
|
||||
delete jQuery.cache[ id ];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Helper function used by the dimensions and offset modules
|
||||
function num(elem, prop) {
|
||||
return elem[0] && parseInt( jQuery.curCSS(elem[0], prop, true), 10 ) || 0;
|
||||
|
|
Loading…
Reference in a new issue