diff options
author | Dave Methvin <dave.methvin@gmail.com> | 2013-04-05 17:30:48 -0400 |
---|---|---|
committer | Dave Methvin <dave.methvin@gmail.com> | 2013-04-06 16:00:58 -0400 |
commit | 5031c9db4bf22cc04472346eeee8f25a61c5ee68 (patch) | |
tree | ebc223d2e27944c85773628bf01a6cf5adcb82a4 | |
parent | 1114611f77ee9cd203db65b120d397dbe2f14d14 (diff) | |
download | jquery-5031c9db4bf22cc04472346eeee8f25a61c5ee68.tar.gz jquery-5031c9db4bf22cc04472346eeee8f25a61c5ee68.zip |
Fix #13741. Make wrap/unwrap methods optional. Close gh-1222.
-rw-r--r-- | Gruntfile.js | 1 | ||||
-rw-r--r-- | README.md | 1 | ||||
-rw-r--r-- | src/manipulation.js | 68 | ||||
-rw-r--r-- | src/wrap.js | 69 | ||||
-rw-r--r-- | test/unit/manipulation.js | 379 |
5 files changed, 271 insertions, 247 deletions
diff --git a/Gruntfile.js b/Gruntfile.js index 809ea3552..5e2917373 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -51,6 +51,7 @@ module.exports = function( grunt ) { "src/event.js", "src/traversing.js", "src/manipulation.js", + { flag: "wrap", src: "src/wrap.js" }, { flag: "css", src: "src/css.js" }, "src/serialize.js", { flag: "event-alias", src: "src/event-alias.js" }, @@ -86,6 +86,7 @@ For example, an app that only used JSONP for `$.ajax()` and did not need to calc - **effects**: The `.animate()` method and its shorthands such as `.slideUp()` or `.hide("slow")`. - **event-alias**: All event attaching/triggering shorthands like `.click()` or `.mouseover()`. - **offset**: The `.offset()`, `.position()`, `.offsetParent()`, `.scrollLeft()`, and `.scrollTop()` methods. +- **wrap**: The `.wrap()`, `.wrapAll()`, `.wrapInner()`, and `.unwrap()` methods. - **sizzle**: The Sizzle selector engine. When this module is excluded, it is replaced by a rudimentary selector engine based on the browser's `querySelectorAll` method that does not support jQuery selector extensions or enhanced semantics. See the selector-native.js file for details. The grunt build process is aware of dependencies across modules. If you explicitly remove a module, its dependent modules will be removed as well. For example, excluding the css module also excludes effects, since the effects module uses `.css()` to animate CSS properties. These dependencies are listed in Gruntfile.js and the build process shows a message for each dependent module it excludes. diff --git a/src/manipulation.js b/src/manipulation.js index a5a1a3975..5cfc853be 100644 --- a/src/manipulation.js +++ b/src/manipulation.js @@ -37,74 +37,6 @@ jQuery.fn.extend({ }, null, value, arguments.length ); }, - wrapAll: function( html ) { - var wrap; - - if ( jQuery.isFunction( html ) ) { - return this.each(function( i ) { - jQuery( this ).wrapAll( html.call(this, i) ); - }); - } - - if ( this[ 0 ] ) { - - // The elements to wrap the target around - wrap = jQuery( html, this[ 0 ].ownerDocument ).eq( 0 ).clone( true ); - - if ( this[ 0 ].parentNode ) { - wrap.insertBefore( this[ 0 ] ); - } - - wrap.map(function() { - var elem = this; - - while ( elem.firstElementChild ) { - elem = elem.firstElementChild; - } - - return elem; - }).append( this ); - } - - return this; - }, - - wrapInner: function( html ) { - if ( jQuery.isFunction( html ) ) { - return this.each(function( i ) { - jQuery( this ).wrapInner( html.call(this, i) ); - }); - } - - return this.each(function() { - var self = jQuery( this ), - contents = self.contents(); - - if ( contents.length ) { - contents.wrapAll( html ); - - } else { - self.append( html ); - } - }); - }, - - wrap: function( html ) { - var isFunction = jQuery.isFunction( html ); - - return this.each(function( i ) { - jQuery( this ).wrapAll( isFunction ? html.call(this, i) : html ); - }); - }, - - unwrap: function() { - return this.parent().each(function() { - if ( !jQuery.nodeName( this, "body" ) ) { - jQuery( this ).replaceWith( this.childNodes ); - } - }).end(); - }, - append: function() { return this.domManip(arguments, true, function( elem ) { if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { diff --git a/src/wrap.js b/src/wrap.js new file mode 100644 index 000000000..5968adbc6 --- /dev/null +++ b/src/wrap.js @@ -0,0 +1,69 @@ +jQuery.fn.extend({ + wrapAll: function( html ) { + var wrap; + + if ( jQuery.isFunction( html ) ) { + return this.each(function( i ) { + jQuery( this ).wrapAll( html.call(this, i) ); + }); + } + + if ( this[ 0 ] ) { + + // The elements to wrap the target around + wrap = jQuery( html, this[ 0 ].ownerDocument ).eq( 0 ).clone( true ); + + if ( this[ 0 ].parentNode ) { + wrap.insertBefore( this[ 0 ] ); + } + + wrap.map(function() { + var elem = this; + + while ( elem.firstElementChild ) { + elem = elem.firstElementChild; + } + + return elem; + }).append( this ); + } + + return this; + }, + + wrapInner: function( html ) { + if ( jQuery.isFunction( html ) ) { + return this.each(function( i ) { + jQuery( this ).wrapInner( html.call(this, i) ); + }); + } + + return this.each(function() { + var self = jQuery( this ), + contents = self.contents(); + + if ( contents.length ) { + contents.wrapAll( html ); + + } else { + self.append( html ); + } + }); + }, + + wrap: function( html ) { + var isFunction = jQuery.isFunction( html ); + + return this.each(function( i ) { + jQuery( this ).wrapAll( isFunction ? html.call(this, i) : html ); + }); + }, + + unwrap: function() { + return this.parent().each(function() { + if ( !jQuery.nodeName( this, "body" ) ) { + jQuery( this ).replaceWith( this.childNodes ); + } + }).end(); + } +}); diff --git a/test/unit/manipulation.js b/test/unit/manipulation.js index c9e6c8f9a..012a0efc9 100644 --- a/test/unit/manipulation.js +++ b/test/unit/manipulation.js @@ -103,221 +103,233 @@ test( "text(Function) with incoming value", function() { equal( jQuery("#sap").text(), "foobar", "Check for merged text of more then one element." ); }); -var testWrap = function( val ) { +if ( jQuery.fn.wrap ) { - expect( 19 ); + var testWrap = function( val ) { - var defaultText, result, j, i, cacheLength; + expect( 19 ); - defaultText = "Try them out:", - result = jQuery("#first").wrap( val("<div class='red'><span></span></div>") ).text(); + var defaultText, result, j, i, cacheLength; - equal( defaultText, result, "Check for wrapping of on-the-fly html" ); - ok( jQuery("#first").parent().parent().is(".red"), "Check if wrapper has class 'red'" ); + defaultText = "Try them out:", + result = jQuery("#first").wrap( val("<div class='red'><span></span></div>") ).text(); - QUnit.reset(); - result = jQuery("#first").wrap( val(document.getElementById("empty")) ).parent(); - ok( result.is("ol"), "Check for element wrapping" ); - equal( result.text(), defaultText, "Check for element wrapping" ); + equal( defaultText, result, "Check for wrapping of on-the-fly html" ); + ok( jQuery("#first").parent().parent().is(".red"), "Check if wrapper has class 'red'" ); - QUnit.reset(); - jQuery("#check1").on( "click", function() { - var checkbox = this; + QUnit.reset(); + result = jQuery("#first").wrap( val(document.getElementById("empty")) ).parent(); + ok( result.is("ol"), "Check for element wrapping" ); + equal( result.text(), defaultText, "Check for element wrapping" ); - ok( checkbox.checked, "Checkbox's state is erased after wrap() action, see #769" ); - jQuery( checkbox ).wrap( val("<div id='c1' style='display:none;'></div>") ); - ok( checkbox.checked, "Checkbox's state is erased after wrap() action, see #769" ); - }).prop( "checked", false )[ 0 ].click(); + QUnit.reset(); + jQuery("#check1").on( "click", function() { + var checkbox = this; - // using contents will get comments regular, text, and comment nodes - j = jQuery("#nonnodes").contents(); - j.wrap( val("<i></i>") ); + ok( checkbox.checked, "Checkbox's state is erased after wrap() action, see #769" ); + jQuery( checkbox ).wrap( val("<div id='c1' style='display:none;'></div>") ); + ok( checkbox.checked, "Checkbox's state is erased after wrap() action, see #769" ); + }).prop( "checked", false )[ 0 ].click(); - // Blackberry 4.6 doesn't maintain comments in the DOM - equal( jQuery("#nonnodes > i").length, jQuery("#nonnodes")[ 0 ].childNodes.length, "Check node,textnode,comment wraps ok" ); - equal( jQuery("#nonnodes > i").text(), j.text(), "Check node,textnode,comment wraps doesn't hurt text" ); + // using contents will get comments regular, text, and comment nodes + j = jQuery("#nonnodes").contents(); + j.wrap( val("<i></i>") ); - // Try wrapping a disconnected node - cacheLength = 0; - for ( i in jQuery.cache ) { - cacheLength++; - } + // Blackberry 4.6 doesn't maintain comments in the DOM + equal( jQuery("#nonnodes > i").length, jQuery("#nonnodes")[ 0 ].childNodes.length, "Check node,textnode,comment wraps ok" ); + equal( jQuery("#nonnodes > i").text(), j.text(), "Check node,textnode,comment wraps doesn't hurt text" ); - j = jQuery("<label/>").wrap( val("<li/>") ); - equal( j[ 0 ] .nodeName.toUpperCase(), "LABEL", "Element is a label" ); - equal( j[ 0 ].parentNode.nodeName.toUpperCase(), "LI", "Element has been wrapped" ); + // Try wrapping a disconnected node + cacheLength = 0; + for ( i in jQuery.cache ) { + cacheLength++; + } - for ( i in jQuery.cache ) { - cacheLength--; - } - equal( cacheLength, 0, "No memory leak in jQuery.cache (bug #7165)" ); - - // Wrap an element containing a text node - j = jQuery("<span/>").wrap("<div>test</div>"); - equal( j[ 0 ].previousSibling.nodeType, 3, "Make sure the previous node is a text element" ); - equal( j[ 0 ].parentNode.nodeName.toUpperCase(), "DIV", "And that we're in the div element." ); - - // Try to wrap an element with multiple elements (should fail) - j = jQuery("<div><span></span></div>").children().wrap("<p></p><div></div>"); - equal( j[ 0 ].parentNode.parentNode.childNodes.length, 1, "There should only be one element wrapping." ); - equal( j.length, 1, "There should only be one element (no cloning)." ); - equal( j[ 0 ].parentNode.nodeName.toUpperCase(), "P", "The span should be in the paragraph." ); - - // Wrap an element with a jQuery set - j = jQuery("<span/>").wrap( jQuery("<div></div>") ); - equal( j[ 0 ].parentNode.nodeName.toLowerCase(), "div", "Wrapping works." ); - - // Wrap an element with a jQuery set and event - result = jQuery("<div></div>").on( "click", function() { - ok( true, "Event triggered." ); - - // Remove handlers on detached elements - result.off(); - jQuery(this).off(); - }); + j = jQuery("<label/>").wrap( val("<li/>") ); + equal( j[ 0 ] .nodeName.toUpperCase(), "LABEL", "Element is a label" ); + equal( j[ 0 ].parentNode.nodeName.toUpperCase(), "LI", "Element has been wrapped" ); - j = jQuery("<span/>").wrap( result ); - equal( j[ 0 ].parentNode.nodeName.toLowerCase(), "div", "Wrapping works." ); + for ( i in jQuery.cache ) { + cacheLength--; + } + equal( cacheLength, 0, "No memory leak in jQuery.cache (bug #7165)" ); + + // Wrap an element containing a text node + j = jQuery("<span/>").wrap("<div>test</div>"); + equal( j[ 0 ].previousSibling.nodeType, 3, "Make sure the previous node is a text element" ); + equal( j[ 0 ].parentNode.nodeName.toUpperCase(), "DIV", "And that we're in the div element." ); + + // Try to wrap an element with multiple elements (should fail) + j = jQuery("<div><span></span></div>").children().wrap("<p></p><div></div>"); + equal( j[ 0 ].parentNode.parentNode.childNodes.length, 1, "There should only be one element wrapping." ); + equal( j.length, 1, "There should only be one element (no cloning)." ); + equal( j[ 0 ].parentNode.nodeName.toUpperCase(), "P", "The span should be in the paragraph." ); + + // Wrap an element with a jQuery set + j = jQuery("<span/>").wrap( jQuery("<div></div>") ); + equal( j[ 0 ].parentNode.nodeName.toLowerCase(), "div", "Wrapping works." ); + + // Wrap an element with a jQuery set and event + result = jQuery("<div></div>").on( "click", function() { + ok( true, "Event triggered." ); + + // Remove handlers on detached elements + result.off(); + jQuery(this).off(); + }); - j.parent().trigger("click"); + j = jQuery("<span/>").wrap( result ); + equal( j[ 0 ].parentNode.nodeName.toLowerCase(), "div", "Wrapping works." ); - // clean up attached elements - QUnit.reset(); -}; + j.parent().trigger("click"); -test( "wrap(String|Element)", function() { - testWrap( manipulationBareObj ); -}); + // clean up attached elements + QUnit.reset(); + }; -test( "wrap(Function)", function() { - testWrap( manipulationFunctionReturningObj ); -}); + test( "wrap(String|Element)", function() { + testWrap( manipulationBareObj ); + }); + + test( "wrap(Function)", function() { + testWrap( manipulationFunctionReturningObj ); + }); -test( "wrap(Function) with index (#10177)", function() { - var expectedIndex = 0, - targets = jQuery("#qunit-fixture p"); + test( "wrap(Function) with index (#10177)", function() { + var expectedIndex = 0, + targets = jQuery("#qunit-fixture p"); - expect( targets.length ); - targets.wrap(function(i) { - equal( i, expectedIndex, "Check if the provided index (" + i + ") is as expected (" + expectedIndex + ")" ); - expectedIndex++; + expect( targets.length ); + targets.wrap(function(i) { + equal( i, expectedIndex, "Check if the provided index (" + i + ") is as expected (" + expectedIndex + ")" ); + expectedIndex++; - return "<div id='wrap_index_'" + i + "'></div>"; + return "<div id='wrap_index_'" + i + "'></div>"; + }); }); -}); -test( "wrap(String) consecutive elements (#10177)", function() { - var targets = jQuery("#qunit-fixture p"); + test( "wrap(String) consecutive elements (#10177)", function() { + var targets = jQuery("#qunit-fixture p"); - expect( targets.length * 2 ); - targets.wrap("<div class='wrapper'></div>"); + expect( targets.length * 2 ); + targets.wrap("<div class='wrapper'></div>"); - targets.each(function() { - var $this = jQuery(this); + targets.each(function() { + var $this = jQuery(this); - ok( $this.parent().is(".wrapper"), "Check each elements parent is correct (.wrapper)" ); - equal( $this.siblings().length, 0, "Each element should be wrapped individually" ); + ok( $this.parent().is(".wrapper"), "Check each elements parent is correct (.wrapper)" ); + equal( $this.siblings().length, 0, "Each element should be wrapped individually" ); + }); }); -}); +} -var testWrapAll = function( val ) { +if ( jQuery.fn.wrapAll ) { - expect( 8 ); + var testWrapAll = function( val ) { - var prev, p, result; + expect( 8 ); - prev = jQuery("#firstp")[ 0 ].previousSibling; - p = jQuery("#firstp,#first")[ 0 ].parentNode; - result = jQuery("#firstp,#first").wrapAll( val("<div class='red'><div class='tmp'></div></div>") ); + var prev, p, result; - 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'" ); - equal( jQuery("#first").parent().parent()[ 0 ].previousSibling, prev, "Correct Previous Sibling" ); - equal( jQuery("#first").parent().parent()[ 0 ].parentNode, p, "Correct Parent" ); + prev = jQuery("#firstp")[ 0 ].previousSibling; + p = jQuery("#firstp,#first")[ 0 ].parentNode; + result = jQuery("#firstp,#first").wrapAll( val("<div class='red'><div class='tmp'></div></div>") ); - QUnit.reset(); - prev = jQuery("#firstp")[ 0 ].previousSibling; - p = jQuery("#first")[ 0 ].parentNode; - result = jQuery("#firstp,#first").wrapAll( val(document.getElementById("empty")) ); + 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'" ); + equal( jQuery("#first").parent().parent()[ 0 ].previousSibling, prev, "Correct Previous Sibling" ); + equal( jQuery("#first").parent().parent()[ 0 ].parentNode, p, "Correct Parent" ); - equal( jQuery("#first").parent()[ 0 ], jQuery("#firstp").parent()[ 0 ], "Same Parent" ); - equal( jQuery("#first").parent()[ 0 ].previousSibling, prev, "Correct Previous Sibling" ); - equal( jQuery("#first").parent()[ 0 ].parentNode, p, "Correct Parent" ); -}; + QUnit.reset(); + prev = jQuery("#firstp")[ 0 ].previousSibling; + p = jQuery("#first")[ 0 ].parentNode; + result = jQuery("#firstp,#first").wrapAll( val(document.getElementById("empty")) ); -test( "wrapAll(String|Element)", function() { - testWrapAll( manipulationBareObj ); -}); + equal( jQuery("#first").parent()[ 0 ], jQuery("#firstp").parent()[ 0 ], "Same Parent" ); + equal( jQuery("#first").parent()[ 0 ].previousSibling, prev, "Correct Previous Sibling" ); + equal( jQuery("#first").parent()[ 0 ].parentNode, p, "Correct Parent" ); + }; -var testWrapInner = function( val ) { + test( "wrapAll(String|Element)", function() { + testWrapAll( manipulationBareObj ); + }); +} - expect( 11 ); +if ( jQuery.fn.wrapInner ) { - var num, result; + var testWrapInner = function( val ) { - num = jQuery("#first").children().length; - result = jQuery("#first").wrapInner( val("<div class='red'><div id='tmp'></div></div>") ); + expect( 11 ); - equal( jQuery("#first").children().length, 1, "Only one child" ); - ok( jQuery("#first").children().is(".red"), "Verify Right Element" ); - equal( jQuery("#first").children().children().children().length, num, "Verify Elements Intact" ); + var num, result; - QUnit.reset(); - num = jQuery("#first").html("foo<div>test</div><div>test2</div>").children().length; - result = jQuery("#first").wrapInner( val("<div class='red'><div id='tmp'></div></div>") ); - equal( jQuery("#first").children().length, 1, "Only one child" ); - ok( jQuery("#first").children().is(".red"), "Verify Right Element" ); - equal( jQuery("#first").children().children().children().length, num, "Verify Elements Intact" ); + num = jQuery("#first").children().length; + result = jQuery("#first").wrapInner( val("<div class='red'><div id='tmp'></div></div>") ); - QUnit.reset(); - num = jQuery("#first").children().length; - result = jQuery("#first").wrapInner( val(document.getElementById("empty")) ); - equal( jQuery("#first").children().length, 1, "Only one child" ); - ok( jQuery("#first").children().is("#empty"), "Verify Right Element" ); - equal( jQuery("#first").children().children().length, num, "Verify Elements Intact" ); - - var div = jQuery("<div/>"); - div.wrapInner( val("<span></span>") ); - equal( div.children().length, 1, "The contents were wrapped." ); - equal( div.children()[ 0 ].nodeName.toLowerCase(), "span", "A span was inserted." ); -}; + equal( jQuery("#first").children().length, 1, "Only one child" ); + ok( jQuery("#first").children().is(".red"), "Verify Right Element" ); + equal( jQuery("#first").children().children().children().length, num, "Verify Elements Intact" ); -test( "wrapInner(String|Element)", function() { - testWrapInner( manipulationBareObj ); -}); + QUnit.reset(); + num = jQuery("#first").html("foo<div>test</div><div>test2</div>").children().length; + result = jQuery("#first").wrapInner( val("<div class='red'><div id='tmp'></div></div>") ); + equal( jQuery("#first").children().length, 1, "Only one child" ); + ok( jQuery("#first").children().is(".red"), "Verify Right Element" ); + equal( jQuery("#first").children().children().children().length, num, "Verify Elements Intact" ); -test( "wrapInner(Function)", function() { - testWrapInner( manipulationFunctionReturningObj ); -}); + QUnit.reset(); + num = jQuery("#first").children().length; + result = jQuery("#first").wrapInner( val(document.getElementById("empty")) ); + equal( jQuery("#first").children().length, 1, "Only one child" ); + ok( jQuery("#first").children().is("#empty"), "Verify Right Element" ); + equal( jQuery("#first").children().children().length, num, "Verify Elements Intact" ); -test( "unwrap()", function() { + var div = jQuery("<div/>"); + div.wrapInner( val("<span></span>") ); + equal( div.children().length, 1, "The contents were wrapped." ); + equal( div.children()[ 0 ].nodeName.toLowerCase(), "span", "A span was inserted." ); + }; - expect( 9 ); + test( "wrapInner(String|Element)", function() { + testWrapInner( manipulationBareObj ); + }); - jQuery("body").append(" <div id='unwrap' style='display: none;'> <div id='unwrap1'> <span class='unwrap'>a</span> <span class='unwrap'>b</span> </div> <div id='unwrap2'> <span class='unwrap'>c</span> <span class='unwrap'>d</span> </div> <div id='unwrap3'> <b><span class='unwrap unwrap3'>e</span></b> <b><span class='unwrap unwrap3'>f</span></b> </div> </div>"); + test( "wrapInner(Function)", function() { + testWrapInner( manipulationFunctionReturningObj ); + }); +} - var abcd = jQuery("#unwrap1 > span, #unwrap2 > span").get(), - abcdef = jQuery("#unwrap span").get(); +if ( jQuery.fn.unwrap ) { - equal( jQuery("#unwrap1 span").add("#unwrap2 span:first-child").unwrap().length, 3, "make #unwrap1 and #unwrap2 go away" ); - deepEqual( jQuery("#unwrap > span").get(), abcd, "all four spans should still exist" ); + test( "unwrap()", function() { - deepEqual( jQuery("#unwrap3 span").unwrap().get(), jQuery("#unwrap3 > span").get(), "make all b in #unwrap3 go away" ); + expect( 9 ); - deepEqual( jQuery("#unwrap3 span").unwrap().get(), jQuery("#unwrap > span.unwrap3").get(), "make #unwrap3 go away" ); + jQuery("body").append(" <div id='unwrap' style='display: none;'> <div id='unwrap1'> <span class='unwrap'>a</span> <span class='unwrap'>b</span> </div> <div id='unwrap2'> <span class='unwrap'>c</span> <span class='unwrap'>d</span> </div> <div id='unwrap3'> <b><span class='unwrap unwrap3'>e</span></b> <b><span class='unwrap unwrap3'>f</span></b> </div> </div>"); - deepEqual( jQuery("#unwrap").children().get(), abcdef, "#unwrap only contains 6 child spans" ); + var abcd = jQuery("#unwrap1 > span, #unwrap2 > span").get(), + abcdef = jQuery("#unwrap span").get(); - deepEqual( jQuery("#unwrap > span").unwrap().get(), jQuery("body > span.unwrap").get(), "make the 6 spans become children of body" ); + equal( jQuery("#unwrap1 span").add("#unwrap2 span:first-child").unwrap().length, 3, "make #unwrap1 and #unwrap2 go away" ); + deepEqual( jQuery("#unwrap > span").get(), abcd, "all four spans should still exist" ); - deepEqual( jQuery("body > span.unwrap").unwrap().get(), jQuery("body > span.unwrap").get(), "can't unwrap children of body" ); - deepEqual( jQuery("body > span.unwrap").unwrap().get(), abcdef, "can't unwrap children of body" ); + deepEqual( jQuery("#unwrap3 span").unwrap().get(), jQuery("#unwrap3 > span").get(), "make all b in #unwrap3 go away" ); - deepEqual( jQuery("body > span.unwrap").get(), abcdef, "body contains 6 .unwrap child spans" ); + deepEqual( jQuery("#unwrap3 span").unwrap().get(), jQuery("#unwrap > span.unwrap3").get(), "make #unwrap3 go away" ); - jQuery("body > span.unwrap").remove(); -}); + deepEqual( jQuery("#unwrap").children().get(), abcdef, "#unwrap only contains 6 child spans" ); + + deepEqual( jQuery("#unwrap > span").unwrap().get(), jQuery("body > span.unwrap").get(), "make the 6 spans become children of body" ); + + deepEqual( jQuery("body > span.unwrap").unwrap().get(), jQuery("body > span.unwrap").get(), "can't unwrap children of body" ); + deepEqual( jQuery("body > span.unwrap").unwrap().get(), abcdef, "can't unwrap children of body" ); + + deepEqual( jQuery("body > span.unwrap").get(), abcdef, "body contains 6 .unwrap child spans" ); + + jQuery("body > span.unwrap").remove(); + }); +} var testAppendForObject = function( valueObj, isFragment ) { var $base, @@ -495,7 +507,9 @@ var testAppend = function( valueObj ) { $radioUnchecked = jQuery("<input type='radio' name='R1' checked='checked'/>").appendTo( $radioParent ); $radioChecked.trigger("click"); $radioUnchecked[ 0 ].checked = false; - $radioParent.wrap("<div></div>"); + + jQuery("<div/>").insertBefore($radioParent).append($radioParent); + equal( $radioChecked[ 0 ].checked, true, "Reappending radios uphold which radio is checked" ); equal( $radioUnchecked[ 0 ].checked, false, "Reappending radios uphold not being checked" ); @@ -1926,18 +1940,21 @@ test( "jQuery.clone - no exceptions for object elements #9587", function() { } }); -test( "jQuery(<tag>) & wrap[Inner/All]() handle unknown elems (#10667)", function() { +if ( jQuery.fn.wrapAll ) { - expect( 2 ); + test( "jQuery(<tag>) & wrap[Inner/All]() handle unknown elems (#10667)", function() { - var $wraptarget = jQuery( "<div id='wrap-target'>Target</div>" ).appendTo( "#qunit-fixture" ), - $section = jQuery( "<section>" ).appendTo( "#qunit-fixture" ); + expect( 2 ); - $wraptarget.wrapAll("<aside style='background-color:green'></aside>"); + var $wraptarget = jQuery( "<div id='wrap-target'>Target</div>" ).appendTo( "#qunit-fixture" ), + $section = jQuery( "<section>" ).appendTo( "#qunit-fixture" ); - notEqual( $wraptarget.parent("aside").get( 0 ).style.backgroundColor, "transparent", "HTML5 elements created with wrapAll inherit styles" ); - notEqual( $section.get( 0 ).style.backgroundColor, "transparent", "HTML5 elements create with jQuery( string ) inherit styles" ); -}); + $wraptarget.wrapAll("<aside style='background-color:green'></aside>"); + + notEqual( $wraptarget.parent("aside").get( 0 ).style.backgroundColor, "transparent", "HTML5 elements created with wrapAll inherit styles" ); + notEqual( $section.get( 0 ).style.backgroundColor, "transparent", "HTML5 elements create with jQuery( string ) inherit styles" ); + }); +} test( "Cloned, detached HTML5 elems (#10667,10670)", function() { @@ -2135,19 +2152,23 @@ test( "script evaluation (#11795)", function() { objGlobal.ok = isOk; }); -test( "wrapping scripts (#10470)", function() { +if ( jQuery.fn.wrap ) { - expect( 2 ); + test( "wrapping scripts (#10470)", function() { - var script = document.createElement("script"); - script.text = script.textContent = "ok( !document.eval10470, 'script evaluated once' ); document.eval10470 = true;"; + expect( 2 ); - document.eval10470 = false; - jQuery("#qunit-fixture").empty()[0].appendChild( script ); - jQuery("#qunit-fixture script").wrap("<b></b>"); - strictEqual( script.parentNode, jQuery("#qunit-fixture > b")[ 0 ], "correctly wrapped" ); - jQuery( script ).remove(); -}); + var script = document.createElement("script"); + script.text = script.textContent = "ok( !document.eval10470, 'script evaluated once' ); document.eval10470 = true;"; + + document.eval10470 = false; + jQuery("#qunit-fixture").empty()[0].appendChild( script ); + jQuery("#qunit-fixture script").wrap("<b></b>"); + 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() { |