浅谈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中新增的样式使用示例附效果图
Aug 19 HTML / CSS
CSS3 display知识详解
Nov 25 HTML / CSS
CSS3的column-fill属性对齐列内容高度的用法详解
Jul 01 HTML / CSS
css3中单位px,em,rem,vh,vw,vmin,vmax的区别及浏览器支持情况
Dec 06 HTML / CSS
浅谈css3中calc在less编译时被计算的解决办法
Dec 04 HTML / CSS
纯css3实现思维导图样式示例
Nov 01 HTML / CSS
CSS3中的弹性布局em运用入门详解 1em等于多少像素
Feb 08 HTML / CSS
浅谈pc和移动端的响应式的使用
Jan 03 HTML / CSS
Web时代变迁及html5与html4的区别
Jan 06 HTML / CSS
解析HTML5中的新功能本地存储localStorage
Mar 01 HTML / CSS
Html5调用手机摄像头并实现人脸识别的实现
Dec 21 HTML / CSS
HTML里显示pdf、word、xls、ppt的方法示例
Apr 14 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把空格、换行符、中文逗号等替换成英文逗号的正则表达式
2014/05/04 PHP
PHP高手需要要掌握的知识点
2014/08/21 PHP
php检查字符串中是否有外链的方法
2015/07/29 PHP
PHP使用MPDF类生成PDF的方法
2015/12/08 PHP
PHP中的函数声明与使用详解
2017/05/27 PHP
Thinkphp5.0框架视图view的循环标签用法示例
2019/10/12 PHP
JSQL  一个 web DB 的封装
2010/05/05 Javascript
JSChart轻量级图形报表工具(内置函数中文参考)
2010/10/11 Javascript
基于Jquery 解决Ajax请求的页面 浏览器后退前进功能,页面刷新功能实效问题
2010/12/11 Javascript
把文本中的URL地址转换为可点击链接的JavaScript、PHP自定义函数
2014/07/29 Javascript
分享我的jquery实现下拉菜单心的
2015/11/29 Javascript
Bootstrap中的Panel和Table全面解析
2016/06/13 Javascript
深入理解 JavaScript 中的 JSON
2017/04/06 Javascript
用vue的双向绑定简单实现一个todo-list的示例代码
2017/08/03 Javascript
vue初尝试--项目结构(推荐)
2018/01/30 Javascript
JS验证输入的是否是数字及保留几位小数问题
2018/05/09 Javascript
JavaScript fetch接口案例解析
2018/08/30 Javascript
微信小程序实现底部导航
2018/11/05 Javascript
vue+element UI实现树形表格带复选框的示例代码
2019/04/16 Javascript
vue-week-picker实现支持按周切换的日历
2019/06/26 Javascript
JavaScript判断数组类型的方法
2019/10/23 Javascript
element表格翻页第2页从1开始编号(后端从0开始分页)
2019/12/10 Javascript
javascript 设计模式之享元模式原理与应用详解
2020/04/08 Javascript
[02:51]2014DOTA2国际邀请赛 IG战队官方纪录片
2014/07/21 DOTA
Python中一行和多行import模块问题
2018/04/01 Python
python3+dlib实现人脸识别和情绪分析
2018/04/21 Python
Python列表切片操作实例总结
2019/02/19 Python
python中sklearn的pipeline模块实例详解
2020/05/21 Python
matplotlib事件处理基础(事件绑定、事件属性)
2021/02/03 Python
汽车技术服务与营销专业在籍生自荐信
2013/09/28 职场文书
小学生家长评语集锦
2014/01/30 职场文书
向领导表决心的话
2014/03/11 职场文书
乡镇群众路线专项整治方案
2014/11/03 职场文书
继续教育心得体会(共6篇)
2016/01/19 职场文书
css实现文章分割线样式的多种方法总结
2021/04/21 HTML / CSS
SQL SERVER中的流程控制语句
2022/05/25 SQL Server