浅谈HTML5 defer和async的区别


Posted in HTML / CSS onJune 07, 2016

在HTML页面中插入Javascript的主要方法,就是使用<script>元素。这个元素由Netscape创造并在Netscape Navigator 2中首先实现。后来,这个元素就被加入到正式的HTML规范中。HTML4.01为<script>定义了6个属性,包括defer和async。defer和async都是可选的,且只对外部脚本文件有效。
 
一、当浏览器解析到script脚本,没有defer或async时:
 
<script src="main.js"></script>

浏览器会立即加载并执行指定的脚本,“立即”指在渲染该script标签之下的文档元素之前,也就是说不等待后续载入的文档元素,读到就加载并执行。
 
二、当浏览器解析到script脚本,有async时:
 
<script async src="main.js"></script>

浏览器会立即下载脚本,但不妨碍页面中的其他操作,比如下载其他资源或等待加载其他脚本。加载和渲染后续文档元素的过程和main.js的加载与执行并行进行(异步)。
 
async不保证按照脚本出现的先后顺序执行,因此,确保两者之前互不依赖非常重要,指定async属性的目的是不让页面等待两个脚本的下载和执行,从而异步加载页面其他内容,建议异步脚本不要在加载期间修改DOM。
 
异步脚本一定会在页面的load事件前执行,但可能会在DOMContentLoaded事件触发之前或之后执行。支持异步脚本的浏览器有Firefox 3.6、Safari 5 和Chrome。
 
三、当浏览器解析到script脚本,有defer时:
 
<script defer="defer" src="main1.js"></script>
<script defer="defer"  src="main2.js"></script>

表示脚本会被延迟到文档完全被解析和显示之后再执行,加载后续文档元素的过程将和main.js的加载并行进行(异步)。HTML5规范要求脚本按照它们出现的先后顺序执行,因此第一个延迟脚本会先于第二个延迟脚本执行,而这两个脚本会先于DOMContentLoaded事件。在现实当中,延迟脚本并不一定会按照顺序执行,也不一定会在DOMContentLoaded事件触发前执行,因此最好只包含一个延迟脚本。
 
IE4~IE7还支持对嵌入脚本的defer属性,但IE8以及之后的版本则完全支持HTML5规定的行为。
 
IE4,Firefox 3.5,Safari 5和Chrome是最早支持defer属性的浏览器。其他浏览器胡忽略这个属性,像平常一样处理脚本,为此,把延迟脚本放在页面底部仍然是最佳选择。
 
蓝色线代表网络读取,红色线代表执行时间,这俩都是针对脚本的;绿色线代表 HTML 解析。
 
此图告诉我们以下几个要点:
 
defer 和 async 在网络读取(下载)这块儿是一样的,都是异步的(相较于 HTML 解析)

它俩的差别在于脚本下载完之后何时执行,显然 defer 是最接近我们对于应用脚本加载和执行的要求的

关于 defer,此图未尽之处在于它是按照加载顺序执行脚本的,这一点要善加利用

async 则是一个乱序执行的主,反正对它来说脚本的加载和执行是紧紧挨着的,所以不管你声明的顺序如何,只要它加载完了就会立刻执行

仔细想想,async 对于应用脚本的用处不大,因为它完全不考虑依赖(哪怕是最低级的顺序执行),不过它对于那些可以不依赖任何脚本或不被任何脚本依赖的脚本来说却是非常合适的,最典型的例子:Google Analytics

以上这篇浅谈HTML5 defer和async的区别就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

原文地址:http://www.cnblogs.com/shouce/archive/2016/06/07/5565898.html

HTML / CSS 相关文章推荐
利用CSS3的flexbox实现水平垂直居中与三列等高布局
Sep 12 HTML / CSS
CSS3中Color的一些特性介绍
May 27 HTML / CSS
CSS3的transition和animation的用法实例介绍
Aug 20 HTML / CSS
纯CSS3发光分享按钮的实现教程
Sep 06 HTML / CSS
CSS3制作炫酷带方向感应的鼠标滑过图片3D动画
Mar 16 HTML / CSS
HTML5离线缓存在tomcat下部署可实现图片flash等离线浏览
Dec 13 HTML / CSS
html5 跨文档消息传输示例探讨
Apr 01 HTML / CSS
HTML5制作酷炫音频播放器插件图文教程
Dec 30 HTML / CSS
使用分层画布来优化HTML5渲染的教程
May 08 HTML / CSS
详解HTML5中download属性的应用
Aug 06 HTML / CSS
Html5实现二维码扫描并解析
Jan 20 HTML / CSS
浅谈html5之sse服务器发送事件EventSource介绍
Aug 28 HTML / CSS
Html5上传图片 移动端、PC端通用代码
Jun 08 #HTML / CSS
你不知道的5个HTML5新功能
Jun 28 #HTML / CSS
HTML5里autofocus自动聚焦属性使用介绍
Jun 22 #HTML / CSS
HTML5 placeholder属性详解
Jun 22 #HTML / CSS
HTML5 本地存储 LocalStorage详解
Jun 24 #HTML / CSS
HTML5中的nav标签学习笔记
Jun 24 #HTML / CSS
HTML5 canvas基本绘图之绘制线段
Jun 27 #HTML / CSS
You might like
php抓取页面的几种方法详解
2013/06/17 PHP
注意:php5.4删除了session_unregister函数
2013/08/05 PHP
兼容PHP和Java的des加密解密代码分享
2014/06/26 PHP
php微信高级接口调用方法(自定义菜单接口、客服接口、二维码)
2016/11/28 PHP
PHP实现的简单对称加密与解密方法实例小结
2017/08/28 PHP
PHP实现从PostgreSQL数据库检索数据分页显示及根据条件查找数据示例
2018/06/09 PHP
php处理多图上传压缩代码功能
2018/06/13 PHP
php实现统计IP数及在线人数的示例代码
2020/07/22 PHP
JQuery获取文本框中字符长度的代码
2011/09/29 Javascript
你必须知道的Javascript知识点之&quot;深入理解作用域链&quot;的介绍
2013/04/23 Javascript
自己编写的支持Ajax验证的JS表单验证插件
2015/05/15 Javascript
Jquery实现遮罩层的方法
2015/06/08 Javascript
JavaScript中判断两个字符串是否相等的方法
2015/07/07 Javascript
webpack+vue.js快速入门教程
2016/10/12 Javascript
layui选项卡效果实现代码
2017/05/19 Javascript
Angularjs验证用户输入的字符串是否为日期时间
2017/06/01 Javascript
Vue工程模板文件 webpack打包配置方法
2017/12/26 Javascript
解决vue单页路由跳转后scrollTop的问题
2018/09/03 Javascript
js实现图片局部放大效果详解
2019/03/18 Javascript
微信小程序wx.navigateTo中events属性实现页面间通信传值,数据同步
2019/07/13 Javascript
在vue项目中使用codemirror插件实现代码编辑器功能
2019/08/27 Javascript
前端vue如何使用高德地图
2020/11/05 Javascript
python编程实现归并排序
2017/04/14 Python
Python爬虫动态ip代理防止被封的方法
2019/07/07 Python
Python基于WordCloud制作词云图
2019/11/29 Python
Python动态导入模块和反射机制详解
2020/02/18 Python
解决pytorch 模型复制的一些问题
2021/03/03 Python
利用CSS3实现文字折纸效果实例代码
2018/07/10 HTML / CSS
ESDlife健康生活易:身体检查预订、搜寻及比较
2019/05/10 全球购物
2019年Java 最常见的 面试题
2016/10/19 面试题
小学生勤俭节约演讲稿
2014/08/28 职场文书
感恩的心主题班会
2015/08/12 职场文书
《玩出了名堂》教学反思
2016/02/17 职场文书
餐饮行业关注的9大营销策略
2019/08/26 职场文书
解决Pytorch修改预训练模型时遇到key不匹配的情况
2021/06/05 Python
redis实现的四种常见限流策略
2021/06/18 Redis