From cb3f842c8889458d96511b0103ebbff5cbac217d Mon Sep 17 00:00:00 2001 From: John Resig Date: Mon, 23 Feb 2009 16:32:45 +0000 Subject: [PATCH] Overhauled the .remove() and .empty() methods to be much more efficient. Fixes bug #4222. --- src/core.js | 29 +++++++++++++++++++++-------- 1 file changed, 21 insertions(+), 8 deletions(-) diff --git a/src/core.js b/src/core.js index 65960e292f..a9e7536955 100644 --- a/src/core.js +++ b/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;