有人能指出我有关此行为的相关标准部分吗?
http://arcanis.github.io/dynamic-scripts/
基本上,有两件事让我感到惊讶:我一直认为动态脚本标签总是在从第一个执行器返回后立即加载(就好像浏览器正在执行内部setImmediate)。但是,在此示例中:
内联标记立即在窗口范围内执行(它们不等待当前执行流的结束)
远程标签在每个其他标签之后执行,即使它们已经附加在它们之前
这种行为是否正确? Chrome,Firefox甚至IE11都得到了相同的结果(除了IE没有触发动态附加的远程脚本),所以我可能会遗漏一些东西。
短代码示例供参考:
<script>
log("Starting standard script tag ...");
var s = document.createElement( 'script' );
s.appendChild( document.createTextNode( 'log("Executing dynamically appended inline script tag")' ) );
document.querySelector( 'head' ).appendChild( s );
log("Ending standard script tag");
</script>
答案 0 :(得分:1)
起初我需要提一下,我没有时间精确地查看规格,所以我可能会错误地解释它。
但是查看 prepare a script 部分,您有以下声明:
[...]
15.然后,必须遵循以下第一个描述情况的选项:
[...]
如果元素没有src属性,并且元素已被标记为“解析器插入”,则创建脚本的解析器是XML解析器,或者是脚本嵌套级别的HTML解析器不大于1,并且创建脚本元素的HTML解析器或XML解析器的Document具有阻止脚本的样式表
该元素是创建元素的解析器Document的挂起解析阻塞脚本。 (每个文档一次只能有一个这样的脚本。)
设置元素的“准备好解析器执行”标志。解析器将处理执行脚本。 德尔>
[...]
,否则强>
即使其他脚本已在执行,用户代理也必须立即执行脚本块。
我这样理解:
但正如我所说,我没有时间详细阅读整篇文章,接下来的几天我会这样做。但是现在这可能已经有所帮助了。
修改强>
在我第一次阅读第一个引用条件后,我意识到我确实没有仔细阅读([...]and the Document of the HTML parser or XML parser that created the script element has a style sheet that is blocking scripts[...]
),所以我用<del>
标记。