Expose cleanData, make sure that all bound event handlers are properly cleaned up...
[jquery.git] / src / manipulation.js
index f2f6c7d..401cf86 100644 (file)
@@ -77,7 +77,14 @@ jQuery.fn.extend({
 
        wrapInner: function( html ) {
                return this.each(function() {
-                       jQuery( this ).contents().wrapAll( html );
+                       var self = jQuery( this ), contents = self.contents();
+
+                       if ( contents.length ) {
+                               contents.wrapAll( html );
+
+                       } else {
+                               self.append( html );
+                       }
                });
        },
 
@@ -186,7 +193,7 @@ jQuery.fn.extend({
                                for ( var i = 0, l = this.length; i < l; i++ ) {
                                        // Remove element nodes and prevent memory leaks
                                        if ( this[i].nodeType === 1 ) {
-                                               cleanData( this[i].getElementsByTagName("*") );
+                                               jQuery.cleanData( this[i].getElementsByTagName("*") );
                                                this[i].innerHTML = value;
                                        }
                                }
@@ -213,10 +220,16 @@ jQuery.fn.extend({
 
        replaceWith: function( value ) {
                if ( this[0] && this[0].parentNode ) {
+                       // Make sure that the elements are removed from the DOM before they are inserted
+                       // this can help fix replacing a parent with child elements
+                       if ( !jQuery.isFunction( value ) ) {
+                               value = jQuery( value ).detach();
+                       }
+
                        return this.each(function() {
                                var next = this.nextSibling, parent = this.parentNode;
 
-                               jQuery(this).detach();
+                               jQuery(this).remove();
 
                                if ( next ) {
                                        jQuery(next).before( value );
@@ -309,7 +322,7 @@ function cloneCopyEvent(orig, ret) {
 }
 
 function buildFragment( args, nodes, scripts ) {
-       var fragment, cacheable, cached, cacheresults, doc;
+       var fragment, cacheable, cacheresults, doc;
 
        if ( args.length === 1 && typeof args[0] === "string" && args[0].length < 512 && args[0].indexOf("<option") < 0 ) {
                cacheable = true;
@@ -318,7 +331,6 @@ function buildFragment( args, nodes, scripts ) {
                        if ( cacheresults !== 1 ) {
                                fragment = cacheresults;
                        }
-                       cached = true;
                }
        }
 
@@ -361,8 +373,8 @@ jQuery.each({
        remove: function( selector, keepData ) {
                if ( !selector || jQuery.filter( selector, [ this ] ).length ) {
                        if ( !keepData && this.nodeType === 1 ) {
-                               cleanData( this.getElementsByTagName("*") );
-                               cleanData( [ this ] );
+                               jQuery.cleanData( this.getElementsByTagName("*") );
+                               jQuery.cleanData( [ this ] );
                        }
 
                        if ( this.parentNode ) {
@@ -374,7 +386,7 @@ jQuery.each({
        empty: function() {
                // Remove element nodes and prevent memory leaks
                if ( this.nodeType === 1 ) {
-                       cleanData( this.getElementsByTagName("*") );
+                       jQuery.cleanData( this.getElementsByTagName("*") );
                }
 
                // Remove any remaining nodes
@@ -481,13 +493,12 @@ jQuery.extend({
                }
 
                return ret;
-       }
-});
-
-function cleanData( elems ) {
-       for ( var i = 0, elem, id; (elem = elems[i]) != null; i++ ) {
-               if ( !jQuery.noData[elem.nodeName.toLowerCase()] && (id = elem[expando]) ) {
-                       delete jQuery.cache[ id ];
+       },
+       
+       cleanData: function( elems ) {
+               for ( var i = 0, elem, id; (elem = elems[i]) != null; i++ ) {
+                       jQuery.event.remove( elem );
+                       jQuery.removeData( elem );
                }
        }
-}
+});
\ No newline at end of file