为什么通过 DOMParser 创建的脚本元素不执行
Why script elements created through DOMParser do not execute?
我正在Ajax中加载HTML,用DOMParser
解析它,并将文档正文的所有childNodes
放入文档片段中。
当我将片段添加到当前文档的正文中时,不会执行<script>
标签。
我摆弄了一下,发现如果我用新的动态创建的脚本标签替换它们,它们就会被正确执行。
我想知道为什么?
例如
var html = "Some html with a script <script>alert('test');</script>";
var frag = parsePartialHtml(html);
fixScriptsSoTheyAreExecuted(frag);
document.body.appendChild(frag);
function fixScriptsSoTheyAreExecuted(el) {
var scripts = el.querySelectorAll('script'),
script, fixedScript, i, len;
for (i = 0, len = scripts.length; i < len; i++) {
script = scripts[i];
fixedScript = document.createElement('script');
fixedScript.type = script.type;
if (script.innerHTML) fixedScript.innerHTML = script.innerHTML;
else fixedScript.src = script.src;
fixedScript.async = false;
script.parentNode.replaceChild(fixedScript, script);
}
}
function parsePartialHtml(html) {
var doc = new DOMParser().parseFromString(html, 'text/html'),
frag = document.createDocumentFragment(),
childNodes = doc.body.childNodes;
while (childNodes.length) frag.appendChild(childNodes[0]);
return frag;
}
如果不调用fixScriptsSoTheyAreExecuted
,则不会执行任何内容。
我觉得很难遵循的另一点是,如果我尝试简单地克隆现有的脚本节点以使用 cloneNode
创建新节点,它不起作用,这表明最初由DOMParser
创建的脚本标签带有阻止它们被执行的状态。
这
在 DOM 解析和序列化规范中有解释:
parseFromString
parseFromString(str, type)
方法必须运行以下步骤, 取决于类型:
"text/html"
使用
HTML parser
解析str
,并返回新创建的文档。脚本标志必须设置为"禁用"。
注意
script
元素被标记为不可执行,并且noscript
被解析为标记。
相关文章:
- 浏览器是否持久缓存脚本元素的编译版本
- 我的Javascript没有'当我把一个脚本元素放在头上从URL加载它时,它不起作用
- 如何将脚本元素从 iframe 内部复制到父元素
- 为什么通过 DOMParser 创建的脚本元素不执行
- 无法将脚本元素附加到标题
- 任意运行时脚本元素和 DOM 元素之间的连接
- 如何在 iframe for jQuery 中添加脚本元素
- 删除脚本元素后,脚本仍会运行
- 脚本元素不包含文件,在 FIrebug 中为空
- 将脚本元素添加到现有 TWebBrowser 文档中
- 为什么这个javascript不打印出一系列脚本元素
- 将脚本元素插入浏览器操作页无效
- 从将查询字符串转换为符号的html字符串中删除脚本元素
- 通过JavaScript在页眉或HTML中动态包含脚本元素
- 删除脚本元素是否会从内存中删除其函数
- 添加<脚本>元素时,CSS 翻译过渡停止工作
- 如何防止创建重复的脚本元素
- 无法在IE 5怪癖模式下使用JavaScript写入脚本元素
- 当尝试追加子脚本元素由于未授权而失败时抛出什么错误?
- 使用PHP访问DOM的脚本元素