From 9c28a320c3fa6dcc06de4919d24da41451843570 Mon Sep 17 00:00:00 2001 From: Vladimir Zhuravlev Date: Fri, 15 Jun 2012 21:37:01 -0400 Subject: [PATCH] Fix #11566, allow appending to DocumentFragment, closes gh-814. --- src/manipulation.js | 4 +- 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("buga")); - equal( result.text(), defaultText + "buga", "Check if text appending works" ); - equal( jQuery("#select3").append(valueObj("")).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( + "", + "", + "" + ); + + 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("buga")); + equal( result.text(), defaultText + "buga", "Check if text appending works" ); + equal( jQuery("#select3").append(valueObj("")).find("option:last-child").attr("value"), "appendTest", "Appending html options to select element"); QUnit.reset(); jQuery("form").append(valueObj("")); @@ -339,10 +388,6 @@ var testAppend = function(valueObj) { ok( jQuery(this).is(":checked"), "Append with name attribute after checked attribute"); }).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 { @@ -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( - "", - "", - "" - ); - - equal( jQuery("#sap").children().length, prev + 3, "Make sure that multiple arguments works." ); - QUnit.reset(); } test("append(String|Element|Array<Element>|jQuery)", function() { -- 2.39.5