技术问询:在load事件期间注入的脚本是否会阻塞其他load事件处理程序?
问题解答:load事件期间注入脚本是否会阻塞其他load处理程序?
先给你一个明确结论:你提供的这段第三方脚本的写法,不会阻塞其他load事件处理程序。下面给你拆解背后的逻辑:
1. load事件处理程序的执行规则
浏览器触发load事件时,会按照事件监听器的绑定顺序,同步依次执行每个处理函数——也就是说,前一个处理函数执行完毕,才会轮到下一个。但这里的“执行完毕”指的是处理函数本身的同步代码跑完,函数内部的异步操作不会影响这个顺序。
2. 动态注入脚本的行为分析
你贴的这段代码里,loadAsync函数是在load事件触发时执行的,它动态创建了一个<script>标签并插入DOM:
var script = document.createElement('script'); script.type = 'text/javascript'; script.src = 'https://example.com/3rdPartyStuff.js'; var firstScript = document.getElementsByTagName('script')[0]; firstScript.parentNode.insertBefore(script, firstScript);
这里有个关键细节:通过document.createElement创建的脚本标签,默认是异步加载的(相当于隐式设置了async=true)。这意味着:
- 脚本的加载会在后台进行,不会阻塞当前
loadAsync函数的执行——函数会很快完成并退出 - 浏览器会继续执行后续绑定的
load事件处理程序,完全不受这个第三方脚本加载的影响 - 第三方脚本加载完成后才会执行,这时候
load事件的所有处理程序大概率已经全部执行完毕了
3. 什么时候会出现阻塞?
只有当你主动修改脚本的加载模式为同步时,才会阻塞后续的load处理程序:
- 如果给脚本设置
script.async = false,脚本会同步加载并执行——这时候当前的load处理函数会卡住,直到脚本加载完成并执行完毕,才会继续往下走,自然就阻塞了后续的load处理程序 - 另外,如果你用
document.write在load事件里写入脚本(非常不推荐的写法),也会导致同步阻塞,甚至可能覆盖整个页面
总结
你拿到的这段第三方脚本的实现是合理的,它不会干扰页面上其他load事件处理程序的执行顺序和时机。如果想要更明确地强调异步特性,也可以显式加上script.async = true,不过默认已经是这个配置了,所以不写也没问题。
内容的提问来源于stack exchange,提问作者crenshaw-dev
相关产品推荐
相关产品推荐

