为什么不't克隆节点<脚本>执行标记
Why don't cloneNode <script> tags execute?
克隆<script>标记不执行。为什么?
示例:
<script id="hello">
console.log("hello execution count ", window.helloCount++);
</script>
<script id="action">
document.body.appendChild(
document.getElementById('hello').cloneNode(true));
console.log('cloned the script');
</script>
执行后,文档中有两个hello脚本,但只有一个执行了。
http://jsbin.com/zuxoro/1/edit?html,控制台,输出
这是我正在处理的一个更大问题的一部分,所以我知道这是一件愚蠢的事情
W3C HTML5规范要求此行为。
每个<script>
元素都有一个名为"已启动"的属性标志。说明书上写着:
最初,脚本元素必须取消设置此标志(脚本块在创建时不是"已启动")如果在要克隆的元素上设置了"已启动"标志,则脚本元素的克隆步骤必须在副本上设置该标志
然后,后来:
如果脚本元素被标记为"已启动",则用户代理此时必须中止这些步骤。脚本未执行。
解决方案不是克隆脚本元素,而是创建填充了相同内容的全新元素。
我不知道为什么它不能与cloneNode
一起使用,但您可以通过将innerHTML
复制到新的脚本节点来获得相同的结果。
var clone = document.createElement('script');
clone.innerHTML = document.getElementById('hello').innerHTML;
document.body.appendChild(clone);
console.log('copied the script');
<script>
window.helloCount = 1;
</script>
<script id="hello">
console.log("hello execution count ", window.helloCount++);
</script>
<div>Copied scripts do execute</div>
原则上,浏览器在页面上执行<script>
时会执行以下操作:
如果脚本<script>
在执行以下操作之前未执行:
- 从
<script>
获取文本 - 调用
eval(thatScriptText)
- 将
<script>
DOM节点标记为已执行
当您克隆节点时,它也会得到内部的"executed"标志,从而阻止脚本进一步执行。
解决方案:如果您想重新执行脚本,请执行步骤#1和#2。在这种情况下不需要克隆。
相关文章:
- 可以<脚本类型=“;text/javascript”>window.location=“/"</
- 使用<ahref>使用谷歌脚本在谷歌表单GUI中标记
- W3验证器->使用<脚本类型=“;text/javascript”>在html的正文中
- HTML文档中脚本标记的位置-<头部>&<身体>有不同的行为
- 如何逃离<脚本>jquery html()中的标记.我使用了innerHTML和outerHTML来解决这个
- </脚本>标签放错地方了
- 内联javascript与"<脚本>"字符串错误地关闭了脚本标记
- "未捕获类型错误/丢弃意外“;因为一句台词而出现?(HTML w/<脚本>)
- <脚本类型=“;模块“>负载性能
- 在<script src=“"></脚本>标签
- 使用几个<脚本>标签不会't工作-只调用一个脚本
- 等效于<script src=“;something1.json”></脚本>
- 如何将脚本添加到<头部>标记
- XSS脚本攻击攻击->可以't调用javascript
- 我如何访问传递给<脚本>标记
- 运行一个特定<脚本>(Dreamweaver)
- 是否在Script Src标记中包含Script<脚本>(JavaScript等)
- VS代码:在<脚本>标签
- 是否可以添加<脚本>添加'_someTag'到iFrame中的URL
- 优化J$plus组合3<脚本>转换为1