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

Why are dynamic inline script tags evaluated before ending the context?

本文关键字:脚本 动态 评估 结束 上下文 为什么      更新时间:2023-09-26

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

http://arcanis.github.io/dynamic-scripts/

基本上,有两件事让我感到惊讶:我一直认为动态脚本标签总是在从第一个执行器返回后立即加载(就好像浏览器正在执行内部设置立即一样)。但是,在此示例中:

  • 内联标记在窗口范围内立即执行(它们不等待当前执行流结束)

  • 远程标记在每个其他标记之后执行,即使它们已附加到它们之前

这种行为正确吗?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>
首先我需要

提到我没有时间精确地查看规格,所以我可能解释错了。

但是,查看准备脚本部分,您有以下语句:

[...]
15. 然后,必须遵循以下描述情况的选项中的第一个:
[...]

如果元素没有 src 属性,并且该元素已标记为"解析器插入",并且创建脚本的分析器是 XML 解析器,或者它是脚本嵌套级别不大于 1 的 HTML 解析器,并且创建脚本元素的 HTML 解析器或 XML 解析器的文档具有阻止脚本
的样式表该元素是创建该元素的解析器的 Document 的挂起解析阻止脚本。(每个文档一次只能有一个这样的脚本。

设置元素的"准备被解析器执行"标志。解析器将处理脚本的执行。
[...]
否则
用户代理必须立即执行脚本块,即使其他脚本已在执行。

我是这样理解的:

  • 以编程方式创建的元素与 Else 条件匹配,因为其他条件(也是我省略的条件)不匹配,因此必须立即执行脚本。

但正如我所说,我没有时间详细阅读整件事,我将在接下来的几天这样做。但就目前而言,这可能已经可以帮助您。

编辑在我第二次阅读第一个引用的条件后,我意识到我确实没有仔细阅读([...]and the Document of the HTML parser or XML parser that created the script element has a style sheet that is blocking scripts[...]),所以我用<del>标记。