Made it so that appendTo, etc. return the inserted elements (thus using pushStack...
authorJohn Resig <jeresig@gmail.com>
Wed, 18 Feb 2009 16:29:43 +0000 (16:29 +0000)
committerJohn Resig <jeresig@gmail.com>
Wed, 18 Feb 2009 16:29:43 +0000 (16:29 +0000)
src/core.js
test/unit/core.js

index c7d10f3..ba796bc 100644 (file)
@@ -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 );
        };
 });
 
index e7f09f6..9befade 100644 (file)
@@ -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() {