]> source.dussan.org Git - jquery.git/commitdiff
Fix #13741. Make wrap/unwrap methods optional. Close gh-1222.
authorDave Methvin <dave.methvin@gmail.com>
Fri, 5 Apr 2013 21:30:48 +0000 (17:30 -0400)
committerDave Methvin <dave.methvin@gmail.com>
Sat, 6 Apr 2013 20:00:58 +0000 (16:00 -0400)
Gruntfile.js
README.md
src/manipulation.js
src/wrap.js [new file with mode: 0644]
test/unit/manipulation.js

index 809ea355251e2d0e181684fb4f78563b3ac5bd05..5e2917373aef4f31ddd3e33a97a7c7d69549f939 100644 (file)
@@ -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" },
index 573c68502205fdccf490c683b5bd108ec7af154e..89a57e6d10ed6d51702b2519fb303cf457d49911 100644 (file)
--- a/README.md
+++ b/README.md
@@ -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.
index a5a1a397596ccd4ffebe85c21722cb59bba8b30b..5cfc853be3eb031cdff6ced646c752ca2a93f9d5 100644 (file)
@@ -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 (file)
index 0000000..5968adb
--- /dev/null
@@ -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();
+       }
+});
index c9e6c8f9a866d743f98cdba6956d834036d6145c..012a0efc9a4f101ccae8a6358f0374d952d3ac42 100644 (file)
@@ -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() {