From: Oleg Gaidarenko Date: Tue, 23 Dec 2014 22:56:21 +0000 (+0300) Subject: Manipulation: make wrapAll funarg execute only once X-Git-Tag: 3.0.0-alpha1+compat~166 X-Git-Url: https://source.dussan.org/?a=commitdiff_plain;h=3dcee021603d5c25cd429cb25c2de5046044ca4c;p=jquery.git Manipulation: make wrapAll funarg execute only once Ref 359b03cac74d7336676a6992f14b7ccab9b28659 --- diff --git a/src/wrap.js b/src/wrap.js index 93c7b2cfd..053b9b5b9 100644 --- a/src/wrap.js +++ b/src/wrap.js @@ -7,18 +7,18 @@ define([ jQuery.fn.extend({ wrapAll: function( html ) { - if ( jQuery.isFunction( html ) ) { - return this.each(function(i) { - jQuery(this).wrapAll( html.call(this, i) ); - }); - } + var wrap; + + if ( this[ 0 ] ) { + if ( jQuery.isFunction( html ) ) { + html = html.call( this[ 0 ] ); + } - if ( this[0] ) { // The elements to wrap the target around - var wrap = jQuery( html, this[0].ownerDocument ).eq(0).clone(true); + wrap = jQuery( html, this[ 0 ].ownerDocument ).eq( 0 ).clone( true ); - if ( this[0].parentNode ) { - wrap.insertBefore( this[0] ); + if ( this[ 0 ].parentNode ) { + wrap.insertBefore( this[ 0 ] ); } wrap.map(function() { diff --git a/test/unit/wrap.js b/test/unit/wrap.js index 114e9faf8..ffc5a92e7 100644 --- a/test/unit/wrap.js +++ b/test/unit/wrap.js @@ -149,6 +149,66 @@ test( "wrapAll(String)", function() { }); +test( "wrapAll(Function)", 5, function() { + var prev = jQuery( "#firstp" )[ 0 ].previousSibling, + p = jQuery( "#firstp,#first" )[ 0 ].parentNode, + result = jQuery( "#firstp,#first" ).wrapAll(function() { + return "
"; + }); + + equal( result.parent().length, 1, "Check for wrapping of on-the-fly html" ); + ok( jQuery( "#first" ).parent().parent().is( ".red" ), "Check if wrapper has class 'red'" ); + ok( jQuery( "#firstp" ).parent().parent().is( ".red" ), "Check if wrapper has class 'red'" ); + ok( jQuery( "#first" ).parent().parent().parent().is( p ), "Correct Parent" ); + strictEqual( jQuery( "#first" ).parent().parent()[ 0 ].previousSibling, prev, "Correct Previous Sibling" ); +}); + +test( "wrapAll(Function) check execution characteristics", 3, function() { + var i = 0; + + jQuery( "non-existent" ).wrapAll(function() { + i++; + return ""; + }); + + ok( !i, "should not execute function argument if target element does not exist" ); + + jQuery( "#firstp" ).wrapAll(function( index ) { + strictEqual( this, jQuery( "#firstp" )[ 0 ], "context must be the first found element" ); + strictEqual( index, undefined, "index argument should not be included in function execution" ); + }); +}); + +test( "wrapAll(Function)", 5, function() { + var prev = jQuery( "#firstp" )[ 0 ].previousSibling, + p = jQuery( "#firstp,#first" )[ 0 ].parentNode, + result = jQuery( "#firstp,#first" ).wrapAll(function() { + return "
"; + }); + + equal( result.parent().length, 1, "Check for wrapping of on-the-fly html" ); + ok( jQuery( "#first" ).parent().parent().is( ".red" ), "Check if wrapper has class 'red'" ); + ok( jQuery( "#firstp" ).parent().parent().is( ".red" ), "Check if wrapper has class 'red'" ); + ok( jQuery( "#first" ).parent().parent().parent().is( p ), "Correct Parent" ); + strictEqual( jQuery( "#first" ).parent().parent()[ 0 ].previousSibling, prev, "Correct Previous Sibling" ); +}); + +test( "wrapAll(Function) check execution characteristics", 3, function() { + var i = 0; + + jQuery( "non-existent" ).wrapAll(function() { + i++; + return ""; + }); + + ok( !i, "should not execute function argument if target element does not exist" ); + + jQuery( "#firstp" ).wrapAll(function( index ) { + strictEqual( this, jQuery( "#firstp" )[ 0 ], "context must be the first found element" ); + strictEqual( index, undefined, "index argument should not be included in function execution" ); + }); +}); + test( "wrapAll(Element)", function() { expect( 3 );