From 46bbda8d060165bc734e4e84c30b1d62f3ebce27 Mon Sep 17 00:00:00 2001 From: Oleg Date: Wed, 9 Jan 2013 13:23:34 +0400 Subject: [PATCH] Ref gh-1117: Don't stop on a falsy value in buildFragment. (cherry picked from commit 8e6c1ba92faf830d40cafe7a4deb4ad5ab9045fe) --- src/manipulation.js | 25 +++++++++++++++---------- test/unit/manipulation.js | 3 ++- 2 files changed, 17 insertions(+), 11 deletions(-) diff --git a/src/manipulation.js b/src/manipulation.js index 416e4c3d6..ce05fd63c 100644 --- a/src/manipulation.js +++ b/src/manipulation.js @@ -619,8 +619,10 @@ jQuery.extend({ }, buildFragment: function( elems, context, scripts, selection ) { - var elem, i, j, tmp, tag, wrap, tbody, - ret = [], + var elem, j, tmp, tag, wrap, tbody, + nodes = [], + i = 0, + l = elems.length, fragment = context.createDocumentFragment(), safe = context === document && safeFragment; @@ -629,15 +631,16 @@ jQuery.extend({ context = document; } - for ( i = 0; (elem = elems[i]) != null; i++ ) { + for ( ; i < l; i++ ) { + elem = elems[ i ]; if ( elem || elem === 0 ) { // Add nodes directly if ( jQuery.type( elem ) === "object" ) { - jQuery.merge( ret, elem.nodeType ? [ elem ] : elem ); + jQuery.merge( nodes, elem.nodeType ? [ elem ] : elem ); // Convert non-html into a text node } else if ( !rhtml.test( elem ) ) { - ret.push( context.createTextNode( elem ) ); + nodes.push( context.createTextNode( elem ) ); // Convert html into DOM nodes } else { @@ -658,7 +661,7 @@ jQuery.extend({ // Manually add leading whitespace removed by IE if ( !jQuery.support.leadingWhitespace && rleadingWhitespace.test( elem ) ) { - ret.push( context.createTextNode( rleadingWhitespace.exec( elem )[0] ) ); + nodes.push( context.createTextNode( rleadingWhitespace.exec( elem )[0] ) ); } // Remove IE's autoinserted from table fragments @@ -681,7 +684,7 @@ jQuery.extend({ } } - jQuery.merge( ret, tmp.childNodes ); + jQuery.merge( nodes, tmp.childNodes ); // Fix #12392 for WebKit and IE > 9 tmp.textContent = ""; @@ -705,10 +708,11 @@ jQuery.extend({ // Reset defaultChecked for any radios and checkboxes // about to be appended to the DOM in IE 6/7 (#8060) if ( !jQuery.support.appendChecked ) { - jQuery.grep( getAll( ret, "input" ), fixDefaultChecked ); + jQuery.grep( getAll( nodes, "input" ), fixDefaultChecked ); } - for ( i = 0; (elem = ret[i]) != null; i++ ) { + i = 0; + while ( (elem = nodes[ i++ ]) ) { safe = jQuery.contains( elem.ownerDocument, elem ); // Append to fragment @@ -726,7 +730,8 @@ jQuery.extend({ // Capture executables if ( scripts ) { - for ( j = 0; (elem = tmp[j]) != null; j++ ) { + j = 0; + while ( (elem = tmp[ j++ ]) ) { if ( rscriptType.test( elem.type || "" ) ) { scripts.push( elem ); } diff --git a/test/unit/manipulation.js b/test/unit/manipulation.js index 0a110725e..74e482a47 100644 --- a/test/unit/manipulation.js +++ b/test/unit/manipulation.js @@ -395,7 +395,7 @@ var testAppendForObject = function( valueObj, isFragment ) { var testAppend = function( valueObj ) { - expect( 59 ); + expect( 60 ); testAppendForObject( valueObj, false ); testAppendForObject( valueObj, true ); @@ -464,6 +464,7 @@ var testAppend = function( valueObj ) { t( "Append Select", "#appendSelect1, #appendSelect2", [ "appendSelect1", "appendSelect2" ] ); equal( "Two nodes", jQuery("
").append( "Two", " nodes" ).text(), "Appending two text nodes (#4011)" ); + equal( jQuery("
").append( "1", "", 3 ).text(), "13", "If median is false-like value, subsequent arguments should not be ignored" ); // using contents will get comments regular, text, and comment nodes j = jQuery("#nonnodes").contents(); -- 2.39.5