]> source.dussan.org Git - jquery.git/commitdiff
Fix #4087. insertAfter, insertBefore, etc do not work if origin and destination are...
authorPaul Ramos <paul.b.ramos@gmail.com>
Mon, 10 Dec 2012 21:12:54 +0000 (16:12 -0500)
committerDave Methvin <dave.methvin@gmail.com>
Wed, 12 Dec 2012 04:35:22 +0000 (23:35 -0500)
src/manipulation.js
test/unit/manipulation.js

index ffaa5c4c456a8a5e42bbdc8ff4fd0185416e8dd1..b9d5f0ff1c6b71dc260a664dd3b0adf0c5bd0969 100644 (file)
@@ -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
index 9d8c93321827be1747b2e9fd2fb2b80f5cf1a91e..41db7291df2b99af796c311f1bbcef751d66d79c 100644 (file)
@@ -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( [
+                       "<ul id='test4087-complex'><li class='test4087'><div>c1</div>h1</li><li><div>c2</div>h2</li></ul>",
+                       "<div id='test4087-simple'><div class='test4087-1'>1<div class='test4087-2'>2</div><div class='test4087-3'>3</div></div></div>",
+                       "<div id='test4087-multiple'><div class='test4087-multiple'>1</div><div class='test4087-multiple'>2</div></div>"
+               ] ).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();
+       });
+});