diff --git a/src/manipulation.js b/src/manipulation.js index 7e5ec07cc..afaaa30ea 100644 --- a/src/manipulation.js +++ b/src/manipulation.js @@ -442,38 +442,28 @@ jQuery.fn.extend({ }, replaceWith: function() { - var - // Snapshot the DOM in case .domManip sweeps something relevant into its fragment - args = jQuery.map( this, function( elem ) { - return [ elem.nextSibling, elem.parentNode ]; - }), - i = 0; + var arg = arguments[ 0 ]; // Make the changes, replacing each context element with the new content this.domManip( arguments, function( elem ) { - var next = args[ i++ ], - parent = args[ i++ ]; + arg = this.parentNode; - if ( parent ) { - // Don't use the snapshot next if it has moved (#13810) - if ( next && next.parentNode !== parent ) { - next = this.nextSibling; - } - jQuery( this ).remove(); - parent.insertBefore( elem, next ); + jQuery.cleanData( getAll( this ) ); + + if ( arg ) { + arg.replaceChild( elem, this ); } - // Allow new content to include elements from the context set - }, true ); + }); // Force removal if there was no new content (e.g., from empty arguments) - return i ? this : this.remove(); + return arg && (arg.length || arg.nodeType) ? this : this.remove(); }, detach: function( selector ) { return this.remove( selector, true ); }, - domManip: function( args, callback, allowIntersection ) { + domManip: function( args, callback ) { // Flatten any nested arrays args = concat.apply( [], args ); @@ -495,12 +485,12 @@ jQuery.fn.extend({ if ( isFunction ) { args[ 0 ] = value.call( this, index, self.html() ); } - self.domManip( args, callback, allowIntersection ); + self.domManip( args, callback ); }); } if ( l ) { - fragment = jQuery.buildFragment( args, this[ 0 ].ownerDocument, false, !allowIntersection && this ); + fragment = jQuery.buildFragment( args, this[ 0 ].ownerDocument, false, this ); first = fragment.firstChild; if ( fragment.childNodes.length === 1 ) { diff --git a/test/unit/manipulation.js b/test/unit/manipulation.js index fae407751..ad89bd1be 100644 --- a/test/unit/manipulation.js +++ b/test/unit/manipulation.js @@ -1010,20 +1010,21 @@ test( "replaceWith(string) for more than one element", function() { equal(jQuery("#foo p").length, 0, "verify that all the three original element have been replaced"); }); -test( "empty replaceWith (#13401; #13596)", 4, function() { - expect( 6 ); - - var $el = jQuery("
"), +test( "Empty replaceWith (#13401; #13596)", 8, function() { + var $el = jQuery( "
" ), tests = { "empty string": "", "empty array": [], - "empty collection": jQuery("#nonexistent") + "empty collection": jQuery( "#nonexistent" ), + + // in case of jQuery(...).replaceWith(); + "empty undefined": undefined }; jQuery.each( tests, function( label, input ) { - $el.html("").children().replaceWith( input ); + $el.html( "" ).children().replaceWith( input ); strictEqual( $el.html(), "", "replaceWith(" + label + ")" ); - $el.html("").children().replaceWith(function() { return input; }); + $el.html( "" ).children().replaceWith(function() { return input; }); strictEqual( $el.html(), "", "replaceWith(function returning " + label + ")" ); }); });