]> source.dussan.org Git - jquery.git/commitdiff
Manipulation: privatize internal domManip() function
authorTimmy Willison <timmywillisn@gmail.com>
Tue, 5 May 2015 18:52:58 +0000 (11:52 -0700)
committerTimmy Willison <timmywillisn@gmail.com>
Tue, 5 May 2015 19:14:21 +0000 (12:14 -0700)
Fixes gh-2225

src/manipulation.js

index 0b068aff02682bd5186782562c5fb0b1f78cb1c6..4371b24931aae850b9bd1a09f4315aabf93085ed 100644 (file)
@@ -138,6 +138,101 @@ function fixCloneNodeIssues( src, dest ) {
        }
 }
 
+function domManip( collection, args, callback, ignored ) {
+
+       // Flatten any nested arrays
+       args = concat.apply( [], args );
+
+       var first, node, hasScripts,
+               scripts, doc, fragment,
+               i = 0,
+               l = collection.length,
+               iNoClone = l - 1,
+               value = args[0],
+               isFunction = jQuery.isFunction( value );
+
+       // We can't cloneNode fragments that contain checked, in WebKit
+       if ( isFunction ||
+                       ( l > 1 && typeof value === "string" &&
+                               !support.checkClone && rchecked.test( value ) ) ) {
+               return collection.each(function( index ) {
+                       var self = collection.eq( index );
+                       if ( isFunction ) {
+                               args[0] = value.call( this, index, self.html() );
+                       }
+                       domManip( self, args, callback, ignored );
+               });
+       }
+
+       if ( l ) {
+               fragment = buildFragment( args, collection[ 0 ].ownerDocument, false, collection, ignored );
+               first = fragment.firstChild;
+
+               if ( fragment.childNodes.length === 1 ) {
+                       fragment = first;
+               }
+
+               // Require either new content or an interest in ignored elements to invoke the callback
+               if ( first || ignored ) {
+                       scripts = jQuery.map( getAll( fragment, "script" ), disableScript );
+                       hasScripts = scripts.length;
+
+                       // Use the original fragment for the last item
+                       // instead of the first because it can end up
+                       // being emptied incorrectly in certain situations (#8070).
+                       for ( ; i < l; i++ ) {
+                               node = fragment;
+
+                               if ( i !== iNoClone ) {
+                                       node = jQuery.clone( node, true, true );
+
+                                       // Keep references to cloned scripts for later restoration
+                                       if ( hasScripts ) {
+                                               // Support: Android<4.1, PhantomJS<2
+                                               // push.apply(_, arraylike) throws on ancient WebKit
+                                               jQuery.merge( scripts, getAll( node, "script" ) );
+                                       }
+                               }
+
+                               callback.call( collection[i], node, i );
+                       }
+
+                       if ( hasScripts ) {
+                               doc = scripts[ scripts.length - 1 ].ownerDocument;
+
+                               // Reenable scripts
+                               jQuery.map( scripts, restoreScript );
+
+                               // Evaluate executable scripts on first document insertion
+                               for ( i = 0; i < hasScripts; i++ ) {
+                                       node = scripts[ i ];
+                                       if ( rscriptType.test( node.type || "" ) &&
+                                               !jQuery._data( node, "globalEval" ) &&
+                                               jQuery.contains( doc, node ) ) {
+
+                                               if ( node.src ) {
+                                                       // Optional AJAX dependency, but won't run scripts if not present
+                                                       if ( jQuery._evalUrl ) {
+                                                               jQuery._evalUrl( node.src );
+                                                       }
+                                               } else {
+                                                       jQuery.globalEval(
+                                                               ( node.text || node.textContent || node.innerHTML || "" )
+                                                                       .replace( rcleanScript, "" )
+                                                       );
+                                               }
+                                       }
+                               }
+                       }
+
+                       // Fix #11809: Avoid leaking memory
+                       fragment = first = null;
+               }
+       }
+
+       return collection;
+}
+
 jQuery.extend({
        htmlPrefilter: function( html ) {
                return html.replace( rxhtmlTag, "<$1></$2>" );
@@ -266,7 +361,7 @@ jQuery.fn.extend({
        },
 
        append: function() {
-               return this.domManip( arguments, function( elem ) {
+               return domManip( this, arguments, function( elem ) {
                        if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {
                                var target = manipulationTarget( this, elem );
                                target.appendChild( elem );
@@ -275,7 +370,7 @@ jQuery.fn.extend({
        },
 
        prepend: function() {
-               return this.domManip( arguments, function( elem ) {
+               return domManip( this, arguments, function( elem ) {
                        if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {
                                var target = manipulationTarget( this, elem );
                                target.insertBefore( elem, target.firstChild );
@@ -284,7 +379,7 @@ jQuery.fn.extend({
        },
 
        before: function() {
-               return this.domManip( arguments, function( elem ) {
+               return domManip( this, arguments, function( elem ) {
                        if ( this.parentNode ) {
                                this.parentNode.insertBefore( elem, this );
                        }
@@ -292,7 +387,7 @@ jQuery.fn.extend({
        },
 
        after: function() {
-               return this.domManip( arguments, function( elem ) {
+               return domManip( this, arguments, function( elem ) {
                        if ( this.parentNode ) {
                                this.parentNode.insertBefore( elem, this.nextSibling );
                        }
@@ -401,7 +496,7 @@ jQuery.fn.extend({
                var ignored = [];
 
                // Make the changes, replacing each non-ignored context element with the new content
-               return this.domManip( arguments, function( elem ) {
+               return domManip( this, arguments, function( elem ) {
                        var parent = this.parentNode;
 
                        if ( jQuery.inArray( this, ignored ) < 0 ) {
@@ -417,102 +512,6 @@ jQuery.fn.extend({
 
        detach: function( selector ) {
                return this.remove( selector, true );
-       },
-
-       domManip: function( args, callback, ignored ) {
-
-               // Flatten any nested arrays
-               args = concat.apply( [], args );
-
-               var first, node, hasScripts,
-                       scripts, doc, fragment,
-                       i = 0,
-                       l = this.length,
-                       set = this,
-                       iNoClone = l - 1,
-                       value = args[0],
-                       isFunction = jQuery.isFunction( value );
-
-               // We can't cloneNode fragments that contain checked, in WebKit
-               if ( isFunction ||
-                               ( l > 1 && typeof value === "string" &&
-                                       !support.checkClone && rchecked.test( value ) ) ) {
-                       return this.each(function( index ) {
-                               var self = set.eq( index );
-                               if ( isFunction ) {
-                                       args[0] = value.call( this, index, self.html() );
-                               }
-                               self.domManip( args, callback, ignored );
-                       });
-               }
-
-               if ( l ) {
-                       fragment = buildFragment( args, this[ 0 ].ownerDocument, false, this, ignored );
-                       first = fragment.firstChild;
-
-                       if ( fragment.childNodes.length === 1 ) {
-                               fragment = first;
-                       }
-
-                       // Require either new content or an interest in ignored elements to invoke the callback
-                       if ( first || ignored ) {
-                               scripts = jQuery.map( getAll( fragment, "script" ), disableScript );
-                               hasScripts = scripts.length;
-
-                               // Use the original fragment for the last item
-                               // instead of the first because it can end up
-                               // being emptied incorrectly in certain situations (#8070).
-                               for ( ; i < l; i++ ) {
-                                       node = fragment;
-
-                                       if ( i !== iNoClone ) {
-                                               node = jQuery.clone( node, true, true );
-
-                                               // Keep references to cloned scripts for later restoration
-                                               if ( hasScripts ) {
-                                                       // Support: Android<4.1, PhantomJS<2
-                                                       // push.apply(_, arraylike) throws on ancient WebKit
-                                                       jQuery.merge( scripts, getAll( node, "script" ) );
-                                               }
-                                       }
-
-                                       callback.call( this[i], node, i );
-                               }
-
-                               if ( hasScripts ) {
-                                       doc = scripts[ scripts.length - 1 ].ownerDocument;
-
-                                       // Reenable scripts
-                                       jQuery.map( scripts, restoreScript );
-
-                                       // Evaluate executable scripts on first document insertion
-                                       for ( i = 0; i < hasScripts; i++ ) {
-                                               node = scripts[ i ];
-                                               if ( rscriptType.test( node.type || "" ) &&
-                                                       !jQuery._data( node, "globalEval" ) &&
-                                                       jQuery.contains( doc, node ) ) {
-
-                                                       if ( node.src ) {
-                                                               // Optional AJAX dependency, but won't run scripts if not present
-                                                               if ( jQuery._evalUrl ) {
-                                                                       jQuery._evalUrl( node.src );
-                                                               }
-                                                       } else {
-                                                               jQuery.globalEval(
-                                                                       ( node.text || node.textContent || node.innerHTML || "" )
-                                                                               .replace( rcleanScript, "" )
-                                                               );
-                                                       }
-                                               }
-                                       }
-                               }
-
-                               // Fix #11809: Avoid leaking memory
-                               fragment = first = null;
-                       }
-               }
-
-               return this;
        }
 });