【问题标题】:Script parsed using DOMParser does not execute使用 DOMParser 解析的脚本不执行
【发布时间】:2018-10-12 12:08:32
【问题描述】:

当我使用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!"

但如果我使用 DOMParser 解析一个 html 字符串,然后将其 firstElementChild 附加到 document.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

在这两种情况下,document.head 都会添加一个 &lt;script&gt; 标记。为什么 JavaScript 在第二种情况下不执行?

【问题讨论】:

    标签: javascript dom


    【解决方案1】:

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

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

    【讨论】:

    • 再创建一个脚本标签,内容为domEl可以解决问题。
    • @3142maple - 确实。考虑到问题的复杂性,我有点假设 OP 会知道该怎么做... :-)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-06-27
    • 2022-01-25
    • 2021-12-28
    • 2015-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多