From f12611feb43adb2b014eb2183db0713451746aff Mon Sep 17 00:00:00 2001 From: Paul Ramos Date: Mon, 10 Dec 2012 16:12:54 -0500 Subject: [PATCH] Fix #4087. insertAfter, insertBefore, etc do not work if origin and destination are same element. Close gh-1068. --- src/manipulation.js | 12 ++++++++---- test/unit/manipulation.js | 34 ++++++++++++++++++++++++++++++++++ 2 files changed, 42 insertions(+), 4 deletions(-) diff --git a/src/manipulation.js b/src/manipulation.js index ffaa5c4c4..b9d5f0ff1 100644 --- a/src/manipulation.js +++ b/src/manipulation.js @@ -254,7 +254,7 @@ jQuery.fn.extend({ // Make sure that the elements are removed from the DOM before they are inserted // this can help fix replacing a parent with child elements if ( !isFunc && typeof value !== "string" ) { - value = jQuery( value ).detach(); + value = jQuery( value ).not( this ).detach(); } return this.domManip( [ value ], true, function( elem ) { @@ -303,7 +303,7 @@ jQuery.fn.extend({ if ( this[0] ) { doc = this[0].ownerDocument; fragment = doc.createDocumentFragment(); - jQuery.clean( args, doc, fragment ); + jQuery.clean( args, doc, fragment, undefined, this ); first = fragment.firstChild; if ( fragment.childNodes.length === 1 ) { @@ -619,7 +619,7 @@ jQuery.extend({ return clone; }, - clean: function( elems, context, fragment, scripts ) { + clean: function( elems, context, fragment, scripts, selection ) { var elem, j, tmp, tag, wrap, tbody, ret = [], i = 0, @@ -714,7 +714,11 @@ jQuery.extend({ safe = jQuery.contains( elem.ownerDocument, elem ); // Append to fragment - fragment.appendChild( elem ); + // #4087 - If origin and destination elements are the same, and this is + // that element, do not append to fragment + if ( !( selection && jQuery.inArray( elem, selection ) !== -1 ) ) { + fragment.appendChild( elem ); + } tmp = getAll( elem, "script" ); // Preserve script evaluation history diff --git a/test/unit/manipulation.js b/test/unit/manipulation.js index 9d8c93321..41db7291d 100644 --- a/test/unit/manipulation.js +++ b/test/unit/manipulation.js @@ -2274,3 +2274,37 @@ test( "wrapping scripts (#10470)", function() { strictEqual( script.parentNode, jQuery("#qunit-fixture > b")[ 0 ], "correctly wrapped" ); jQuery( script ).remove(); }); + +test( "insertAfter, insertBefore, etc do not work when destination is original element. Element is removed (#4087)", function() { + + expect( 10 ); + + var elems; + + jQuery.each([ + "appendTo", + "prependTo", + "insertBefore", + "insertAfter", + "replaceAll" + ], function( index, name ) { + elems = jQuery( [ + "", + "
1
2
3
", + "
1
2
" + ] ).appendTo( "#qunit-fixture" ); + + // complex case based on http://jsfiddle.net/pbramos/gZ7vB/ + jQuery("#test4087-complex div")[ name ]("#test4087-complex li:last-child div:last-child"); + equal( jQuery("#test4087-complex li:last-child div").length, name === "replaceAll" ? 1 : 2, name +" a node to itself, complex case." ); + + // simple case + jQuery( ".test4087-1" )[ name ](".test4087-1"); + equal( jQuery(".test4087-1").length, 1, name +" a node to itself, simple case." ); + + // clean for next test + jQuery("#test4087-complex").remove(); + jQuery("#test4087-simple").remove(); + jQuery("#test4087-multiple").remove(); + }); +}); -- 2.39.5