首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >是否保证<script>标记上的load事件总是在脚本执行时被触发?

是否保证<script>标记上的load事件总是在脚本执行时被触发?
EN

Stack Overflow用户
提问于 2019-02-06 01:47:47
回答 1查看 822关注 0票数 5

假设有两个JavaScript文件。

one.js

代码语言:javascript
复制
window.a=1;

two.js

代码语言:javascript
复制
window.a=2;

和加载程序: loader.html

代码语言:javascript
复制
<body></body>
<script>
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);
</script>

它总是以1或2的形式产生吗?(编辑:它的意思不是“我想要的代码,总是产生-1”或“我想要的代码,总是产生-2”。1和2都可以接受.)

出局-1

代码语言:javascript
复制
"one.js" 1
"two.js" 2

出局-2

代码语言:javascript
复制
"two.js" 2
"one.js" 1

我担心的是浏览器是否会按照s1-exec -> s2-exec -> s1-onload -> s2-onload并产生Out-3的顺序运行。

出局-3

代码语言:javascript
复制
"one.js" 2
"two.js" 2

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

蚂蚁上面写着:

如果负载成功

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

它是否保证“其他脚本标记不会中断步骤1和步骤2之间的进程”?

(编辑)换句话说,我想知道HTML规范是否要求浏览器通过step1通过step2同步运行(标题“立即”意味着这一点)。

EN

回答 1

Stack Overflow用户

发布于 2019-02-06 03:08:59

至少根据规范,可以保证load事件在“执行脚本块”算法的末尾触发。

所以,你可以面对-1和2,但不是出局-3。

当您在文档中追加元素时,它将作为async脚本加载。这意味着无法保证脚本-1和脚本-2之间的执行顺序。

代码语言:javascript
复制
// scr1 will load an external script
const scr1 = document.createElement('script');
scr1.onload = e => console.log('1', window.$);
scr1.src = 'https://cdn.jsdelivr.net/gh/jquery/jquery@3.2/dist/jquery.js?' + Math.random();
// scr2 will load a dataURL script
const scr2 = document.createElement('script');
scr2.onload = e => console.log('2', window.$);
scr2.src = 'data:application/javascript,$="script 2"';

// even though scr1 is appended first
document.head.appendChild(scr1);
document.head.appendChild(scr2);

但是,当他们在执行脚本块算法的末尾请求事件时,没有任何竞争条件,事件的回调将被同步执行。

(注意:如果他们要求"使任务排队 to 引发事件",就像在其他地方一样,那么回调就会异步启动,但仍然没有竞争条件,因为两个任务都会在同一个任务队列中排队)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54545576

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档