diff options
author | Vladimir Zhuravlev <private.face@gmail.com> | 2012-06-15 21:37:01 -0400 |
---|---|---|
committer | Dave Methvin <dave.methvin@gmail.com> | 2012-06-15 21:37:01 -0400 |
commit | 9c28a320c3fa6dcc06de4919d24da41451843570 (patch) | |
tree | b8eb9e1c8d15a631e4fef983d793ef58d57d6d4e | |
parent | 0b352f6cb58a1ece3f5d1fb978cdb40bd5b0e854 (diff) | |
download | jquery-9c28a320c3fa6dcc06de4919d24da41451843570.tar.gz jquery-9c28a320c3fa6dcc06de4919d24da41451843570.zip |
Fix #11566, allow appending to DocumentFragment, closes gh-814.
-rw-r--r-- | src/manipulation.js | 4 | ||||
-rw-r--r-- | test/unit/manipulation.js | 104 |
2 files changed, 71 insertions, 37 deletions
diff --git a/src/manipulation.js b/src/manipulation.js index ca5ccf412..a7751ac82 100644 --- a/src/manipulation.js +++ b/src/manipulation.js @@ -127,7 +127,7 @@ jQuery.fn.extend({ append: function() { return this.domManip(arguments, true, function( elem ) { - if ( this.nodeType === 1 ) { + if ( this.nodeType === 1 || this.nodeType === 11 ) { this.appendChild( elem ); } }); @@ -135,7 +135,7 @@ jQuery.fn.extend({ prepend: function() { return this.domManip(arguments, true, function( elem ) { - if ( this.nodeType === 1 ) { + if ( this.nodeType === 1 || this.nodeType === 11 ) { this.insertBefore( elem, this.firstChild ); } }); diff --git a/test/unit/manipulation.js b/test/unit/manipulation.js index 13c653533..3c3542ef2 100644 --- a/test/unit/manipulation.js +++ b/test/unit/manipulation.js @@ -280,40 +280,89 @@ test("unwrap()", function() { jQuery("body > span.unwrap").remove(); }); -var testAppend = function(valueObj) { - expect(46); - var defaultText = "Try them out:" - var result = jQuery("#first").append(valueObj("<b>buga</b>")); - equal( result.text(), defaultText + "buga", "Check if text appending works" ); - equal( jQuery("#select3").append(valueObj("<option value='appendTest'>Append Test</option>")).find("option:last-child").attr("value"), "appendTest", "Appending html options to select element"); +var getWrappedElement = function() { + return jQuery("#sap"); +}; - QUnit.reset(); +var getWrappedDocumentFragment = function() { + var f = document.createDocumentFragment(); + + // copy contents of #sap into new fragment + var clone = jQuery("#sap")[0].cloneNode(true); + var childs = clone.childNodes; + while (clone.childNodes.length) { + f.appendChild(clone.childNodes[0]); + } + + clone = null; + return jQuery(f); +}; + +var testAppendForObject = function(valueObj, isFragment) { var expected = "This link has class=\"blog\": Simon Willison's WeblogTry them out:"; - jQuery("#sap").append(valueObj(document.getElementById("first"))); - equal( jQuery("#sap").text(), expected, "Check for appending of element" ); + var objType = " " + (isFragment ? "(DocumentFragment)" : "(Element)"); + var getObj = isFragment ? getWrappedDocumentFragment : getWrappedElement; + + var obj = getObj(); + obj.append(valueObj(document.getElementById("first"))); + equal( obj.text(), expected, "Check for appending of element" + objType); QUnit.reset(); expected = "This link has class=\"blog\": Simon Willison's WeblogTry them out:Yahoo"; - jQuery("#sap").append(valueObj([document.getElementById("first"), document.getElementById("yahoo")])); - equal( jQuery("#sap").text(), expected, "Check for appending of array of elements" ); + obj = getObj(); + obj.append(valueObj([document.getElementById("first"), document.getElementById("yahoo")])); + equal( obj.text(), expected, "Check for appending of array of elements" + objType ); QUnit.reset(); expected = "This link has class=\"blog\": Simon Willison's WeblogYahooTry them out:"; - jQuery("#sap").append(valueObj(jQuery("#yahoo, #first"))); - equal( jQuery("#sap").text(), expected, "Check for appending of jQuery object" ); + obj = getObj(); + obj.append(valueObj(jQuery("#yahoo, #first"))); + equal( obj.text(), expected, "Check for appending of jQuery object" + objType ); QUnit.reset(); - jQuery("#sap").append(valueObj( 5 )); - ok( jQuery("#sap")[0].innerHTML.match( /5$/ ), "Check for appending a number" ); + obj = getObj(); + obj.append(valueObj( 5 )); + ok( obj.text().match( /5$/ ), "Check for appending a number" + objType ); + + QUnit.reset(); + obj = getObj(); + obj.append(valueObj( " text with spaces " )); + ok( obj.text().match(/ text with spaces $/), "Check for appending text with spaces" + objType ); + + QUnit.reset(); + obj = getObj(); + ok( obj.append(valueObj( [] )), "Check for appending an empty array." + objType ); + ok( obj.append(valueObj( "" )), "Check for appending an empty string." + objType ); + ok( obj.append(valueObj( document.getElementsByTagName("foo") )), "Check for appending an empty nodelist." + objType ); + + QUnit.reset(); + obj = getObj(); + obj.append(valueObj( document.getElementById("form") )); + equal( obj.children("form").size(), 1, "Check for appending a form" + objType ); // Bug #910 QUnit.reset(); - jQuery("#sap").append(valueObj( " text with spaces " )); - ok( jQuery("#sap")[0].innerHTML.match(/ text with spaces $/), "Check for appending text with spaces" ); + var obj = getObj(); + var prev = obj.children().length; + obj.append( + "<span></span>", + "<span></span>", + "<span></span>" + ); + + equal( obj.children().length, prev + 3, "Make sure that multiple arguments works." + objType ); QUnit.reset(); - ok( jQuery("#sap").append(valueObj( [] )), "Check for appending an empty array." ); - ok( jQuery("#sap").append(valueObj( "" )), "Check for appending an empty string." ); - ok( jQuery("#sap").append(valueObj( document.getElementsByTagName("foo") )), "Check for appending an empty nodelist." ); +} + +var testAppend = function(valueObj) { + expect(56); + testAppendForObject(valueObj, false); + testAppendForObject(valueObj, true); + + var defaultText = "Try them out:" + var result = jQuery("#first").append(valueObj("<b>buga</b>")); + equal( result.text(), defaultText + "buga", "Check if text appending works" ); + equal( jQuery("#select3").append(valueObj("<option value='appendTest'>Append Test</option>")).find("option:last-child").attr("value"), "appendTest", "Appending html options to select element"); QUnit.reset(); jQuery("form").append(valueObj("<input name='radiotest' type='radio' checked='checked' />")); @@ -340,10 +389,6 @@ var testAppend = function(valueObj) { }).remove(); QUnit.reset(); - jQuery("#sap").append(valueObj( document.getElementById("form") )); - equal( jQuery("#sap>form").size(), 1, "Check for appending a form" ); // Bug #910 - - QUnit.reset(); var pass = true; try { var body = jQuery("#iframe")[0].contentWindow.document.body; @@ -404,17 +449,6 @@ var testAppend = function(valueObj) { equal( $radio[0].checked, true, "Reappending radios uphold which radio is checked" ); equal( $radioNot[0].checked, false, "Reappending radios uphold not being checked" ); QUnit.reset(); - - var prev = jQuery("#sap").children().length; - - jQuery("#sap").append( - "<span></span>", - "<span></span>", - "<span></span>" - ); - - equal( jQuery("#sap").children().length, prev + 3, "Make sure that multiple arguments works." ); - QUnit.reset(); } test("append(String|Element|Array<Element>|jQuery)", function() { |