From e984d1c79cc476062818e03df04a366baa13d197 Mon Sep 17 00:00:00 2001 From: Oleg Gaidarenko Date: Wed, 21 Jan 2015 21:47:03 +0300 Subject: [PATCH] Manipulation: don't auto-insert tbody Fixes gh-1835 Closes gh-2021 --- src/manipulation.js | 12 +++---- test/unit/manipulation.js | 75 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 81 insertions(+), 6 deletions(-) diff --git a/src/manipulation.js b/src/manipulation.js index b11f56074..7c9f5049a 100644 --- a/src/manipulation.js +++ b/src/manipulation.js @@ -57,14 +57,14 @@ wrapMap.optgroup = wrapMap.option; wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead; wrapMap.th = wrapMap.td; -// Manipulating tables requires a tbody function manipulationTarget( elem, content ) { - return jQuery.nodeName( elem, "table" ) && - jQuery.nodeName( content.nodeType !== 11 ? content : content.firstChild, "tr" ) ? + if ( jQuery.nodeName( elem, "table" ) && + jQuery.nodeName( content.nodeType !== 11 ? content : content.firstChild, "tr" ) ) { - elem.getElementsByTagName("tbody")[0] || - elem.appendChild( elem.ownerDocument.createElement("tbody") ) : - elem; + return elem.getElementsByTagName( "tbody" )[ 0 ] || elem; + } + + return elem; } // Replace/restore the type attribute of script elements for safe DOM manipulation diff --git a/test/unit/manipulation.js b/test/unit/manipulation.js index 70047622d..5c73a192c 100644 --- a/test/unit/manipulation.js +++ b/test/unit/manipulation.js @@ -2452,6 +2452,81 @@ test( "Validate creation of multiple quantities of certain elements (#13818)", 4 }); }); +test( "Make sure tr element will be appended to tbody element of table when present", function() { + expect( 1 ); + + var html, + table = document.createElement( "table" ); + + table.appendChild( document.createElement( "tbody" ) ); + document.getElementById( "qunit-fixture" ).appendChild( table ); + + jQuery( table ).append( "test" ); + + // Lowercase and replace spaces to remove possible browser inconsistencies + html = table.innerHTML.toLowerCase().replace( /\s/g, "" ); + + strictEqual( html, "test" ); +}); + +test( "Make sure tr elements will be appended to tbody element of table when present", function() { + expect( 1 ); + + var html, + table = document.createElement( "table" ); + + table.appendChild( document.createElement( "tbody" ) ); + document.getElementById( "qunit-fixture" ).appendChild( table ); + + jQuery( table ).append( "12" ); + + // Lowercase and replace spaces to remove possible browser inconsistencies + html = table.innerHTML.toLowerCase().replace( /\s/g, "" ); + + strictEqual( html, "12" ); +}); + +test( "Make sure tfoot element will not be appended to tbody element of table when present", function() { + expect( 1 ); + + var html, + table = document.createElement( "table" ); + + table.appendChild( document.createElement( "tbody" ) ); + document.getElementById( "qunit-fixture" ).appendChild( table ); + + jQuery( table ).append( "" ); + + // Lowercase and replace spaces to remove possible browser inconsistencies + html = table.innerHTML.toLowerCase().replace( /\s/g, "" ); + + strictEqual( html, "" ); +}); + +test( "Make sure document fragment will be appended to tbody element of table when present", function() { + expect( 1 ); + + var html, + fragment = document.createDocumentFragment(), + table = document.createElement( "table" ), + tr = document.createElement( "tr" ), + td = document.createElement( "td" ); + + table.appendChild( document.createElement( "tbody" ) ); + document.getElementById( "qunit-fixture" ).appendChild( table ); + + fragment.appendChild( tr ); + tr.appendChild( td ); + td.innerHTML = "test"; + + jQuery( table ).append( fragment ); + + // Lowercase and replace spaces to remove possible browser inconsistencies + html = table.innerHTML.toLowerCase().replace( /\s/g, "" ); + + strictEqual( html, "test" ); +}); + test( "Make sure col element is appended correctly", function() { expect( 1 );