From 75a973da35d4ad6583ebef8c389cebbef61bc5b4 Mon Sep 17 00:00:00 2001
From: John Resig <jeresig@gmail.com>
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 c7d10f3..ba796bc 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 e7f09f6..9befade 100644
--- a/test/unit/core.js
+++ b/test/unit/core.js
@@ -909,7 +909,7 @@ test("append(String|Element|Array&lt;Element&gt;|jQuery)", function() {
 });
 
 test("appendTo(String|Element|Array&lt;Element&gt;|jQuery)", function() {
-	expect(7);
+	expect(12);
 	var defaultText = 'Try them out:'
 	jQuery('<b>buga</b>').appendTo('#first');
 	equals( jQuery("#first").text(), defaultText + 'buga', 'Check if text appending works' );
@@ -936,6 +936,27 @@ test("appendTo(String|Element|Array&lt;Element&gt;|jQuery)", function() {
 	reset();
 	jQuery('#select1').appendTo('#foo');
 	t( 'Append select', '#foo select', ['select1'] );
+
+	reset();
+	var div = jQuery("<div/>").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("<div/>").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&lt;Element&gt;|jQuery)", function() {
-- 
1.7.10.4