最近回过头重看红宝书,看到script标签的时候有一个疑惑:
在html文件中,给script标签加上defer或者async属性后,如果JS文件异步下载还未结束的时候文档就解析完成了会怎么样?是等待JS下载完成、解析并且执行完成后再触发DOMContantLoaded方法吗?
希望大家帮我解惑,谢谢:)
最近回过头重看红宝书,看到script标签的时候有一个疑惑:
在html文件中,给script标签加上defer或者async属性后,如果JS文件异步下载还未结束的时候文档就解析完成了会怎么样?是等待JS下载完成、解析并且执行完成后再触发DOMContantLoaded方法吗?
希望大家帮我解惑,谢谢:)
10 回答11.3k 阅读
5 回答4.9k 阅读✓ 已解决
4 回答3.2k 阅读✓ 已解决
2 回答2.8k 阅读✓ 已解决
3 回答2.4k 阅读✓ 已解决
3 回答2.2k 阅读✓ 已解决
2 回答2.6k 阅读✓ 已解决
defer 延迟执行,但会在DOMContentLoaded事件发生之前执行完毕,defer脚本会顺序同步的执行。defer延迟是相对于整个文档的解析来讲,指的脚本的开始加载的时间点。
async 异步执行,具体什么时间点执行由浏览器决定,具体的时间点不确定,但是确定会去加载执行,设置了async的各个脚本加载执行完毕的时间和它们放置插入的顺序没有确定的关系。和DOMContentLoaded事件发生也没有确定的前后关系,可能在DOMContentLoaded事件前某个async脚本执行完了,也有可能async脚本一个都没有执行。async指的是文档的加载方式,同步的还是异步的,并不指定什么时候开始加载。一般都会处理成在DOMContentLoaded事件发生后,就相当于这些脚本是通过JS脚本动态添加的
normal.js
defer.js
html
输出