Make sure the fragment isn't used if it's not the same set we're working with. Fixes...
[jquery.git] / src / manipulation.js
index b2a9df9..1453f98 100644 (file)
@@ -300,7 +300,7 @@ jQuery.fn.extend({
        },
 
        domManip: function( args, table, callback ) {
-               var results, first, value = args[0], scripts = [], fragment;
+               var results, first, value = args[0], scripts = [], fragment, parent;
 
                // We can't cloneNode fragments that contain checked, in WebKit
                if ( !jQuery.support.checkClone && arguments.length === 3 && typeof value === "string" && rchecked.test( value ) ) {
@@ -318,9 +318,12 @@ jQuery.fn.extend({
                }
 
                if ( this[0] ) {
+                       parent = value && value.parentNode;
+
                        // If we're in a fragment, just use that instead of building a new one
-                       if ( args[0] && args[0].parentNode && args[0].parentNode.nodeType === 11 ) {
-                               results = { fragment: args[0].parentNode };
+                       if ( parent && parent.nodeType === 11 && parent.childNodes.length === this.length ) {
+                               results = { fragment: parent };
+
                        } else {
                                results = buildFragment( args, this, scripts );
                        }
@@ -429,9 +432,10 @@ jQuery.each({
        replaceAll: "replaceWith"
 }, function( name, original ) {
        jQuery.fn[ name ] = function( selector ) {
-               var ret = [], insert = jQuery( selector );
+               var ret = [], insert = jQuery( selector ),
+                       parent = this.length === 1 && this[0].parentNode;
                
-               if ( this.length === 1 && this[0].parentNode && this[0].parentNode.nodeType === 11 && insert.length === 1 ) {
+               if ( parent && parent.nodeType === 11 && parent.childNodes.length === 1 && insert.length === 1 ) {
                        insert[ original ]( this[0] );
                        return this;