diff options
author | Richard Gibson <richard.gibson@gmail.com> | 2024-01-08 12:30:39 -0500 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-01-08 18:30:39 +0100 |
commit | 937923d9ee8dfd19008447b5059cbd13ee5a23ac (patch) | |
tree | 07f1aaa7840258ddf6b87ed8506f52adadec9525 | |
parent | e8b7db4b0f1e1b8e08578641b30a92b955ccc4ec (diff) | |
download | jquery-937923d9ee8dfd19008447b5059cbd13ee5a23ac.tar.gz jquery-937923d9ee8dfd19008447b5059cbd13ee5a23ac.zip |
Manipulation: Support $el.html(selfRemovingScript) (#5378)
Don't try to remove a script element that has already removed itself.
Also, compress `DOMEval.js`.
Fixes gh-5377
Closes gh-5378
-rw-r--r-- | src/core/DOMEval.js | 13 | ||||
-rw-r--r-- | test/unit/manipulation.js | 15 |
2 files changed, 22 insertions, 6 deletions
diff --git a/src/core/DOMEval.js b/src/core/DOMEval.js index 806f29ebe..21f5a463c 100644 --- a/src/core/DOMEval.js +++ b/src/core/DOMEval.js @@ -14,12 +14,13 @@ export function DOMEval( code, node, doc ) { script = doc.createElement( "script" ); script.text = code; - if ( node ) { - for ( i in preservedScriptAttributes ) { - if ( node[ i ] ) { - script[ i ] = node[ i ]; - } + for ( i in preservedScriptAttributes ) { + if ( node && node[ i ] ) { + script[ i ] = node[ i ]; } } - doc.head.appendChild( script ).parentNode.removeChild( script ); + + if ( doc.head.appendChild( script ).parentNode ) { + script.parentNode.removeChild( script ); + } } diff --git a/test/unit/manipulation.js b/test/unit/manipulation.js index e197712fb..b40ba6056 100644 --- a/test/unit/manipulation.js +++ b/test/unit/manipulation.js @@ -1819,6 +1819,21 @@ QUnit.test( "html(script nomodule)", function( assert ) { }, 1000 ); } ); +QUnit.test( "html(self-removing script) (gh-5377)", function( assert ) { + assert.expect( 2 ); + + var $fixture = jQuery( "#qunit-fixture" ); + + $fixture.html( + [ + "<script>document.currentScript.parentNode.removeChild( document.currentScript ); QUnit.assert.ok( true, 'removed document.currentScript' );</script>", + "<div>", + "<script>document.currentScript.parentNode.removeChild( document.currentScript ); QUnit.assert.ok( true, 'removed inner document.currentScript' );</script>", + "</div>" + ].join( "" ) + ); +} ); + QUnit.test( "html(Function) with incoming value -- direct selection", function( assert ) { assert.expect( 4 ); |