From 75a973da35d4ad6583ebef8c389cebbef61bc5b4 Mon Sep 17 00:00:00 2001 From: John Resig Date: Wed, 18 Feb 2009 16:29:43 +0000 Subject: [PATCH] Made it so that appendTo, etc. return the inserted elements (thus using pushStack, as well). Fixes bugs #3966 and #4182. --- src/core.js | 23 +++++++++++++---------- test/unit/core.js | 23 ++++++++++++++++++++++- 2 files changed, 35 insertions(+), 11 deletions(-) diff --git a/src/core.js b/src/core.js index c7d10f3c8..ba796bca9 100644 --- a/src/core.js +++ b/src/core.js @@ -502,13 +502,13 @@ jQuery.fn = jQuery.prototype = { if ( this[0] ) { var fragment = (this[0].ownerDocument || this[0]).createDocumentFragment(), scripts = jQuery.clean( args, (this[0].ownerDocument || this[0]), fragment ), - first = fragment.firstChild, - extra = this.length > 1 ? fragment.cloneNode(true) : fragment; + first = fragment.firstChild; if ( first ) for ( var i = 0, l = this.length; i < l; i++ ) - callback.call( root(this[i], first), i > 0 ? extra.cloneNode(true) : fragment ); - + callback.call( root(this[i], first), this.length > 1 || i > 0 ? + fragment.cloneNode(true) : fragment ); + if ( scripts ) jQuery.each( scripts, evalScript ); } @@ -1189,13 +1189,16 @@ jQuery.each({ insertAfter: "after", replaceAll: "replaceWith" }, function(name, original){ - jQuery.fn[ name ] = function() { - var args = arguments; + jQuery.fn[ name ] = function( selector ) { + var ret = [], insert = jQuery( selector ); - return this.each(function(){ - for ( var i = 0, length = args.length; i < length; i++ ) - jQuery( args[ i ] )[ original ]( this ); - }); + for ( var i = 0, l = insert.length; i < l; i++ ) { + var elems = (i > 0 ? this.clone(true) : this).get(); + jQuery.fn[ original ].apply( jQuery(insert[i]), elems ); + ret = ret.concat( elems ); + } + + return this.pushStack( ret, name, selector ); }; }); diff --git a/test/unit/core.js b/test/unit/core.js index e7f09f62c..9befade7d 100644 --- a/test/unit/core.js +++ b/test/unit/core.js @@ -909,7 +909,7 @@ test("append(String|Element|Array<Element>|jQuery)", function() { }); test("appendTo(String|Element|Array<Element>|jQuery)", function() { - expect(7); + expect(12); var defaultText = 'Try them out:' jQuery('buga').appendTo('#first'); equals( jQuery("#first").text(), defaultText + 'buga', 'Check if text appending works' ); @@ -936,6 +936,27 @@ test("appendTo(String|Element|Array<Element>|jQuery)", function() { reset(); jQuery('#select1').appendTo('#foo'); t( 'Append select', '#foo select', ['select1'] ); + + reset(); + var div = jQuery("
").click(function(){ + ok(true, "Running a cloned click."); + }); + div.appendTo("#main, #moretests"); + + jQuery("#main div:last").click(); + jQuery("#moretests div:last").click(); + + reset(); + var div = jQuery("
").appendTo("#main, #moretests"); + + equals( div.length, 2, "appendTo returns the inserted elements" ); + + div.addClass("test"); + + ok( jQuery("#main div:last").hasClass("test"), "appendTo element was modified after the insertion" ); + ok( jQuery("#moretests div:last").hasClass("test"), "appendTo element was modified after the insertion" ); + + reset(); }); test("prepend(String|Element|Array<Element>|jQuery)", function() {