使用 DOMParser 解析的脚本不执行

udh*_*thi 5 javascript dom

当我使用创建脚本元素document.createElement并将其附加到时document.head,JavaScript 成功执行:

var el = document.createElement('script');
el.text = "console.log('Hello World!')";
document.head.insertAdjacentElement('afterbegin', el);
// console output: "Hello World!"
Run Code Online (Sandbox Code Playgroud)

但是如果我使用 DOMParser 解析 html 字符串然后将其附加firstElementChilddocument.head,则 JavaScript 不会执行:

var parser = new DOMParser();
var htmlString = "<script>console.log('Bye World!')<\/script>";
var domEl = parser.parseFromString(htmlString, "text/xml").firstElementChild;
document.head.insertAdjacentElement('afterbegin', domEl);
// No console output
Run Code Online (Sandbox Code Playgroud)

在这两种情况下<script>都会添加一个标签。document.head为什么在第二种情况下 JavaScript 不执行?

T.J*_*der 4

因为DOMParser 会在禁用脚本 ( specDOMParser ) 的情况下解析(和其他)元素,因此会标记该script元素,使其不会运行。脚本是否应该运行是与元素关联的一条状态信息,这就是为什么不会运行脚本两次的原因:text/xmlscript

var el = document.createElement('script');
el.text = "console.log('Hello World!')";
document.head.insertAdjacentElement('afterbegin', el);
document.head.removeChild(el);
document.head.appendChild(el);
Run Code Online (Sandbox Code Playgroud)