为什么在结束上下文之前评估动态内联脚本标记?

时间:2014-04-02 10:45:24

标签: javascript html5

有人能指出我有关此行为的相关标准部分吗?

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>

1 个答案:

答案 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>标记。