是否可以确保脚本执行后立即触发<script>标签上的load事件?

时间:2019-02-06 01:47:47

标签: javascript html dom

假设有两个JavaScript文件。

one.js

  window.a = 1;
 

two.js

  window.a = 2;
 

和加载程序: loader.html

   
<脚本>
const s1 = document.createElement(“ script”);
s1.src =“ one.js”;
s1.addEventListener(“ load”,()=> console.log(“ one.js”,window.a));
const s2 = document.createElement(“ script”);
s2.src =“ two.js”;
s2.addEventListener(“ load”,()=> console.log(“ two.js”,window.a));
document.body.appendChild(s1);
document.body.appendChild(s2);

 

它总是产生为[Out-1]或[Out-2]吗? (已编辑:这表示“我不希望总是产生[Out-1]的代码”或“我不希望总是产生[Out-2]的代码”。[Out-1]和[Out-2]都可以接受)

[Out-1](按s1-exec-> s1-onload-> s2-exec-> s2-onload的顺序运行。可以):

 “ one.js” 1
“ two.js” 2
 

[Out-2](s2-exec-> s2-onload-> s1-exec-> s1-onload。也可以):

 “ two.js” 2
“ one.js” 1
 

我担心的是,浏览器是否可以按s1-exec-> s2-exec-> s1-onload-> s2-onload的顺序运行并生成为[Out-3]

[Out-3](不好):

 “ one.js” 2
“ two.js” 2
 

我检查了HTML5规范 https://www.w3.org/TR/ 2008 / WD-html5-20080610 / tabular.html#script

说:

  

如果加载成功

     
      
  1. 如果脚本元素的文档在其浏览上下文中是活动文档,则用户代理必须执行脚本:   ....
  2.   
  3. 然后,用户代理必须在脚本元素上触发加载事件。
  4.   

是否可以确保“其他脚本标签永远不会中断步骤1和步骤2之间的过程”?

(编辑)换句话说,我想知道HTML规范是否要求浏览器同步运行step1到step2(标题“立即”表示此意思)。

2 个答案:

答案 0 :(得分:1)

至少每个规格(永远不能保证实现)是的,可以保证在"execute the script block"算法的末尾加载事件会触发,但是...我不确定这样可以保证您的事件处理程序会被调用。

因此,可以肯定的是,您可以面对[out-1]和[out-2],但是[out-3]不够清晰。

在文档中添加