浏览器在找到<script>
标记时阻止解析和呈现页面的原因之一是允许脚本修改DOM。
来自Load Non-blocking JavaScript with HTML5 Async and Defer:
推迟属性
defer属性向浏览器庄严承诺。它指出 您的JavaScript不包含任何document.write或DOM 修改nastiness:
浏览器将开始播放 无需并行下载file.js和其他延迟脚本 停止页面processing.defer是在Internet Explorer中实现的 4.0版 - 超过12年前!它也可以在Firefox中使用 从版本3.5开始。所有延迟脚本都保证可以运行 序列,很难确定何时会发生。理论上, 它应该在DOM完全加载之后不久发生 DOMContentLoaded事件。在实践中,它取决于操作系统和 浏览器,脚本是否被缓存,以及其他脚本是什么 在那时做。
据我了解,defer
属性表示与浏览器的“契约”,您的脚本不会更改DOM。 async
也是如此吗?
(当然,这并不妨碍您使用async
加载更改DOM的脚本 - 您只需构建代码,以便在文档就绪或加载时完成DOM更改。
答案 0 :(得分:3)
不,它没有,也不相信你链接的那篇文章。 defer
and async
属性告诉浏览器何时应该执行脚本以及解析是否应该在加载时等待。它没有任何承诺。
因此,使用其中任何一个属性都会阻止 document.write
在脚本的位置写入,对于defer
,启用直接DOM修改以影响在script
元素之后解析的DOM元素。