Optimize for the case where a fragment-bound element is being injected into one other...
[jquery.git] / src / manipulation.js
index 4d0ffd0..01c6b0b 100644 (file)
@@ -77,6 +77,12 @@ jQuery.fn.extend({
        },
 
        wrapInner: function( html ) {
+               if ( jQuery.isFunction( html ) ) {
+                       return this.each(function(i) {
+                               jQuery(this).wrapInner( html.call(this, i) );
+                       });
+               }
+
                return this.each(function() {
                        var self = jQuery( this ), contents = self.contents();
 
@@ -142,6 +148,40 @@ jQuery.fn.extend({
                        return set;
                }
        },
+       
+       // 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;
+       },
+
+       empty: function() {
+               for ( var i = 0, elem; (elem = this[i]) != null; i++ ) {
+                       // Remove element nodes and prevent memory leaks
+                       if ( elem.nodeType === 1 ) {
+                               jQuery.cleanData( elem.getElementsByTagName("*") );
+                       }
+
+                       // Remove any remaining nodes
+                       while ( elem.firstChild ) {
+                               elem.removeChild( elem.firstChild );
+                       }
+               }
+               
+               return this;
+       },
 
        clone: function( events ) {
                // Do the clone
@@ -227,6 +267,12 @@ jQuery.fn.extend({
                        // this can help fix replacing a parent with child elements
                        if ( !jQuery.isFunction( value ) ) {
                                value = jQuery( value ).detach();
+
+                       } else {
+                               return this.each(function(i) {
+                                       var self = jQuery(this), old = self.html();
+                                       self.replaceWith( value.call( this, i, old ) );
+                               });
                        }
 
                        return this.each(function() {
@@ -369,45 +415,20 @@ jQuery.each({
 }, function( name, original ) {
        jQuery.fn[ name ] = function( selector ) {
                var ret = [], insert = jQuery( selector );
-
-               for ( var i = 0, l = insert.length; i < l; i++ ) {
-                       var elems = (i > 0 ? this.clone(true) : this).get();
-                       jQuery.fn[ original ].apply( jQuery(insert[i]), elems );
-                       ret = ret.concat( elems );
-               }
-               return this.pushStack( ret, name, insert.selector );
-       };
-});
-
-jQuery.each({
-       // keepData is for internal use only--do not document
-       remove: function( selector, keepData ) {
-               if ( !selector || jQuery.filter( selector, [ this ] ).length ) {
-                       if ( !keepData && this.nodeType === 1 ) {
-                               jQuery.cleanData( this.getElementsByTagName("*") );
-                               jQuery.cleanData( [ this ] );
-                       }
-
-                       if ( this.parentNode ) {
-                                this.parentNode.removeChild( this );
+               
+               if ( this.length === 1 && this[0].parentNode && this[0].parentNode.nodeType === 11 && insert.length === 1 ) {
+                       insert[ original ]( this[0] );
+                       return this;
+                       
+               } else {
+                       for ( var i = 0, l = insert.length; i < l; i++ ) {
+                               var elems = (i > 0 ? this.clone(true) : this).get();
+                               jQuery.fn[ original ].apply( jQuery(insert[i]), elems );
+                               ret = ret.concat( elems );
                        }
+               
+                       return this.pushStack( ret, name, insert.selector );
                }
-       },
-
-       empty: function() {
-               // Remove element nodes and prevent memory leaks
-               if ( this.nodeType === 1 ) {
-                       jQuery.cleanData( this.getElementsByTagName("*") );
-               }
-
-               // Remove any remaining nodes
-               while ( this.firstChild ) {
-                       this.removeChild( this.firstChild );
-               }
-       }
-}, function( name, fn ) {
-       jQuery.fn[ name ] = function() {
-               return this.each( fn, arguments );
        };
 });
 
@@ -422,13 +443,13 @@ jQuery.extend({
 
                var ret = [];
 
-               jQuery.each(elems, function( i, elem ) {
+               for ( var i = 0, elem; (elem = elems[i]) != null; i++ ) {
                        if ( typeof elem === "number" ) {
                                elem += "";
                        }
 
                        if ( !elem ) {
-                               return;
+                               continue;
                        }
 
                        // Convert html string into DOM nodes
@@ -479,7 +500,7 @@ jQuery.extend({
                                        div.insertBefore( context.createTextNode( rleadingWhitespace.exec(elem)[0] ), div.firstChild );
                                }
 
-                               elem = jQuery.makeArray( div.childNodes );
+                               elem = div.childNodes;
                        }
 
                        if ( elem.nodeType ) {
@@ -487,13 +508,13 @@ jQuery.extend({
                        } else {
                                ret = jQuery.merge( ret, elem );
                        }
-
-               });
+               }
 
                if ( fragment ) {
                        for ( var i = 0; ret[i]; i++ ) {
                                if ( scripts && jQuery.nodeName( ret[i], "script" ) && (!ret[i].type || ret[i].type.toLowerCase() === "text/javascript") ) {
                                        scripts.push( ret[i].parentNode ? ret[i].parentNode.removeChild( ret[i] ) : ret[i] );
+                               
                                } else {
                                        if ( ret[i].nodeType === 1 ) {
                                                ret.splice.apply( ret, [i + 1, 0].concat(jQuery.makeArray(ret[i].getElementsByTagName("script"))) );
@@ -507,9 +528,24 @@ jQuery.extend({
        },
        
        cleanData: function( elems ) {
-               for ( var i = 0, elem, id; (elem = elems[i]) != null; i++ ) {
-                       jQuery.event.remove( elem );
-                       jQuery.removeData( elem );
+               var data, id, cache = jQuery.cache;
+               
+               for ( var i = 0, elem; (elem = elems[i]) != null; i++ ) {
+                       id = elem[ jQuery.expando ];
+                       
+                       if ( id ) {
+                               data = cache[ id ];
+                               
+                               if ( data.events ) {
+                                       for ( var event in data.events ) {
+                                               removeEvent( elem, event, data.handle );
+                                       }
+                               }
+                               
+                               removeExpando( elem );
+                               
+                               delete cache[ id ];
+                       }
                }
        }
 });