假设有两个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之间的过程”?
(编辑)换句话说,我想知道HTML规范是否要求浏览器同步运行step1到step2(标题“立即”表示此意思)。
答案 0 :(得分:1)
至少每个规格(永远不能保证实现)是的,可以保证在"execute the script block"算法的末尾加载事件会触发,但是...我不确定这样可以保证您的事件处理程序会被调用。
因此,可以肯定的是,您可以面对[out-1]和[out-2],但是[out-3]不够清晰。
在文档中添加