async属性是否代表不更改DOM的合同?

时间:2015-10-20 11:16:02

标签: javascript html html5 dom

浏览器在找到<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更改。

1 个答案:

答案 0 :(得分:3)

不,它没有,也不相信你链接的那篇文章。 defer and async属性告诉浏览器何时应该执行脚本以及解析是否应该在加载时等待。它没有任何承诺。

因此,使用其中任何一个属性都会阻止 document.write在脚本的位置写入,对于defer启用直接DOM修改以影响在script元素之后解析的DOM元素。