diff --git a/src/manipulation.js b/src/manipulation.js index 8806455eb..0b6a2d7a0 100644 --- a/src/manipulation.js +++ b/src/manipulation.js @@ -207,6 +207,10 @@ jQuery.fn.extend({ parent = args[ i++ ]; 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 ); } diff --git a/test/unit/manipulation.js b/test/unit/manipulation.js index 8311ee134..6a6851142 100644 --- a/test/unit/manipulation.js +++ b/test/unit/manipulation.js @@ -920,7 +920,7 @@ test( "insertAfter(String|Element|Array|jQuery)", function() { function testReplaceWith( val ) { var tmp, y, child, child2, set, non_existent, $div, - expected = 26; + expected = 29; expect( expected ); @@ -996,6 +996,18 @@ function testReplaceWith( val ) { equal( set[0].childNodes.length, 0, "No effect on a disconnected node." ); + child = jQuery("#qunit-fixture").children().first(); + $div = jQuery("
").insertBefore( child ); + $div.replaceWith( $div ); + deepEqual( jQuery( ".pathological", "#qunit-fixture" ).get(), $div.get(), + "Self-replacement" ); + $div.replaceWith( child ); + deepEqual( jQuery("#qunit-fixture").children().first().get(), child.get(), + "Replacement with following sibling (#13810)" ); + deepEqual( jQuery( ".pathological", "#qunit-fixture" ).get(), [], + "Replacement with following sibling (context removed)" ); + + non_existent = jQuery("#does-not-exist").replaceWith( val("should not throw an error") ); equal( non_existent.length, 0, "Length of non existent element." );