diff --git a/core/misc/ajax.es6.js b/core/misc/ajax.es6.js index 742fe68..1033713 100644 --- a/core/misc/ajax.es6.js +++ b/core/misc/ajax.es6.js @@ -1053,20 +1053,27 @@ else if (type === 'fade') { const onlyElementNodes = responseDataNodes.every( element => element.nodeType === Node.ELEMENT_NODE || element.nodeType === Node.COMMENT_NODE - || element.textContent.trim().length === 0, + // Ignore any TEXT_NODE that only contains whitespace. + || (element.nodeType === Node.TEXT_NODE && element.textContent.trim().length === 0), ); + // Find the first node that is not COMMENT_NODE. + const firstNonCommentNode = responseDataNodes.filter(element => element.nodeType !== Node.COMMENT_NODE)[0]; - // When there are only element and/or comment nodes in the response, no - // extra wrapping necessary. - if (onlyElementNodes && trimmedData !== '') { + // When there are only element and/or comment nodes in the response or if + // the method is 'html' and the element can be safely converted a jQuery + // object, no extra wrapping necessary. + if (onlyElementNodes || (method === 'html' && firstNonCommentNode.nodeType === Node.ELEMENT_NODE)) { $newContent = $(trimmedData); } // When there are other types of top-level nodes, the response needs to be // wrapped. else { - // If response.data contains mixed node types and the wrapping element - // is not styled as a block, response.data will be wrapped with SPAN. - if ($wrapper.css('display') !== 'block') { + const onlyTextOrCommentNodes = responseDataNodes.every( + element => element.nodeType === Node.COMMENT_NODE || element.nodeType === Node.TEXT_NODE, + ); + // If response.data contains only nodes of the type TEXT_NODE or + // COMMENT_NODE, response.data will be wrapped with SPAN. + if (onlyTextOrCommentNodes) { $newContent = $(''); } else { diff --git a/core/misc/ajax.js b/core/misc/ajax.js index d453144..3fa9aff 100644 --- a/core/misc/ajax.js +++ b/core/misc/ajax.js @@ -494,13 +494,21 @@ function loadAjaxBehavior(base) { } var onlyElementNodes = responseDataNodes.every(function (element) { - return element.nodeType === Node.ELEMENT_NODE || element.nodeType === Node.COMMENT_NODE || element.textContent.trim().length === 0; + return element.nodeType === Node.ELEMENT_NODE || element.nodeType === Node.COMMENT_NODE || element.nodeType === Node.TEXT_NODE && element.textContent.trim().length === 0; }); - if (onlyElementNodes && trimmedData !== '') { + var firstNonCommentNode = responseDataNodes.filter(function (element) { + return element.nodeType !== Node.COMMENT_NODE; + })[0]; + + if (onlyElementNodes || method === 'html' && firstNonCommentNode.nodeType === Node.ELEMENT_NODE) { $newContent = $(trimmedData); } else { - if ($wrapper.css('display') !== 'block') { + var onlyTextOrCommentNodes = responseDataNodes.every(function (element) { + return element.nodeType === Node.COMMENT_NODE || element.nodeType === Node.TEXT_NODE; + }); + + if (onlyTextOrCommentNodes) { $newContent = $(''); } else { $newContent = $('
'); diff --git a/core/modules/system/tests/modules/ajax_test/src/Controller/AjaxTestController.php b/core/modules/system/tests/modules/ajax_test/src/Controller/AjaxTestController.php index ce2cc59..28e565c 100644 --- a/core/modules/system/tests/modules/ajax_test/src/Controller/AjaxTestController.php +++ b/core/modules/system/tests/modules/ajax_test/src/Controller/AjaxTestController.php @@ -327,7 +327,8 @@ protected function getRenderTypes() { 'mixed' => ' foo foo barsome string
final string
', 'top-level-only' => 'some string
final string
some string
final string