HTML5 script元素async、defer异步加载使用介绍


Posted in HTML / CSS onAugust 23, 2013

(译者注: 异步加载,可以理解为无阻塞并发处理.)

我对于HTML5感到兴奋不已的原因之一是它实现了众多业界期待已久的特性。我们一直需要输入框显示空白提示,但都是用JavaScript来实现的。我们也想要整个块都变成可被点击,也是使用JavaScript来实现。
现在WebKit为HTML5实现了SCRIPT标签的async异步属性。过去我们使用各种JavaScript技巧来做这种事情,但现在新的属性让防止阻塞变得相对容易。

async - HTML属性
如我前面提到的,添加async属性非常简单:

复制代码
代码如下:

<!-- 指定async,以及 onload 回调-->
<script async src="siteScript.js" onload="myInit()"></script>

事实上,如果你的JavaScript以及HTML结构设计的合理,那么90%的情况下你的Script元素可以使用异步加载。

defer - HTML属性
Safari 浏览器额外添加了defer属性

复制代码
代码如下:

<!-- 指定defer,效果和async差不多-->
<script defer src="siteScript.js" onload="myInit()"></script>

async 与 defer 的差别
WebKit官方博客 很好地解释了async 与 defer 的不同
------------------------------------
正常情况下,当浏览器在解析HTML源文件时如果遇到外部的script,那么解析过程会暂停,并发送请求来下载script文件,只有script完全下载并执行后才会继续执行DOM解析。比如:
<script src="myBlockingScript.js"></script>
在下载过程中浏览器是被阻止做其他有用的工作的,包括 解析HTML,执行其他脚本,以及展示CSS布局。虽然Webkit预加载扫描程序可以探测性地在下载阶段进行多线程下载,但是某些页面仍然存在很大的网络延迟。
当前有很多技术来提升页面显示速度,但都需要额外的代码以及针对特定浏览器的技巧。现在,script可以通过添加async或者defer属性来让脚本不必同步执行,示例如下:
复制代码
代码如下:

<script async src="myAsyncScript.js" onload="myInit()"></script>
<script defer src="myDeferScript.js" onload="myInit()"></script>

async 和 defer 标注的 script 都不会暂停HTML解析就立刻被下载,两者都支持onload事件回调来解决需要该脚本来执行的初始化。
两者的区别在于执行时的不同:
async 脚本在script文件下载完成后会立即执行,并且其执行时间一定在 window的load事件触发之前。这意味着多个async脚本很可能不会按其在页面中的出现次序顺序执行。
与此相对,浏览器确保多个 defer 脚本按其在HTML页面中的出现顺序依次执行,且执行时机为DOM解析完成后,document的DOMContentLoaded 事件触发之前。

下面展示的是一个需要1秒来下载,以及1秒来解析执行其他操作的例子,我们可以看到整个页面载入花了大约2秒钟。
HTML5 script元素async、defer异步加载使用介绍 
同样的例子,但这次我们指定了script的 defer 属性.因为当defer脚本下载的时候,其他操作可以并行执行,所以大概快了1倍。
HTML5 script元素async、defer异步加载使用介绍 
------------------------------------
哪些浏览器支持async 和 defer
同样是上面引用的文章中提到:

除了基于Webkit的新版本浏览器,FireFox已经支持defer和onload属性很长时间了,而且从FF3.6开始添加了async属性。IE同样支持defer属性,但还不支持async属性,从IE9开始,onload属性也将被支持。

aynsc 棒极了!
看到webkit实现async我开心得合不拢嘴了。对每个网站来说,阻塞都是一个巨大的性能瓶颈,而可以直接指定script文件异步加载无疑会加快web页面的速度.

HTML / CSS 相关文章推荐
css3 给背景设置渐变色的方法
Sep 12 HTML / CSS
css3遮罩层镂空效果的多种实现方法
May 11 HTML / CSS
HTML5 placeholder属性详解
Jun 22 HTML / CSS
使用phonegap检测网络状态的方法
Mar 30 HTML / CSS
HTML5 本地存储和内容按需加载的思路和方法
Apr 07 HTML / CSS
html5 Canvas画图教程(8)—canvas里画曲线之bezierCurveTo方法
Jan 09 HTML / CSS
5个你不知道的HTML5的接口介绍
Aug 07 HTML / CSS
详解HTML5中的manifest缓存使用
Sep 09 HTML / CSS
Web时代变迁及html5与html4的区别
Jan 06 HTML / CSS
基于HTML5+CSS3实现简单的时钟效果
Sep 11 HTML / CSS
SVG实现多彩圆环倒计时效果的示例代码
Nov 21 HTML / CSS
css3实现的加载动画效果
Apr 07 HTML / CSS
html5基础教程常用技巧整理
Aug 20 #HTML / CSS
HTML5中div、article、section的区别及使用介绍
Aug 14 #HTML / CSS
用html5的canvas画布绘制贝塞尔曲线完整代码
Aug 14 #HTML / CSS
HTML5 embed 标签使用方法介绍
Aug 13 #HTML / CSS
HTML5 input元素类型:email及url介绍
Aug 13 #HTML / CSS
HTML5 预加载让页面得以快速呈现
Aug 13 #HTML / CSS
HTML5的语法变化介绍
Aug 13 #HTML / CSS
You might like
分页显示Oracle数据库记录的类之二
2006/10/09 PHP
php设计模式之工厂方法模式分析【星际争霸游戏案例】
2020/01/23 PHP
phpStorm2020 注册码
2020/09/17 PHP
图片格式的JavaScript和CSS速查手册
2007/08/20 Javascript
JS小功能(offsetLeft实现图片滚动效果)实例代码
2013/11/28 Javascript
浅谈javascript中的instanceof和typeof
2015/02/27 Javascript
JavaScript事件 &quot;事件对象&quot;的注意要点
2016/01/14 Javascript
jQuery+canvas实现简单的球体斜抛及颜色动态变换效果
2016/01/28 Javascript
Angular.JS去掉访问路径URL中的#号详解
2017/03/30 Javascript
老生常谈javascript中逻辑运算符&amp;&amp;和||的返回值问题
2017/04/13 Javascript
js计算两个日期间的天数月的实例代码
2018/09/20 Javascript
微信小程序实现无限滚动列表
2020/05/29 Javascript
layui复选框的全选与取消实现方法
2019/09/02 Javascript
Vue修改项目启动端口号方法
2019/11/07 Javascript
微信小程序之导航滑块视图容器功能的实现代码(简单两步)
2020/06/19 Javascript
React冒泡和阻止冒泡的应用详解
2020/08/18 Javascript
[01:11:21]DOTA2-DPC中国联赛 正赛 VG vs Elephant BO3 第一场 3月6日
2021/03/11 DOTA
Python使用PyCrypto实现AES加密功能示例
2017/05/22 Python
对numpy 数组和矩阵的乘法的进一步理解
2018/04/04 Python
python爬虫 使用真实浏览器打开网页的两种方法总结
2018/04/21 Python
Python 2.7中文显示与处理方法
2018/07/16 Python
如何通过python实现全排列
2020/02/11 Python
Python文件操作基础流程解析
2020/03/19 Python
python中取绝对值简单方法总结
2020/07/24 Python
CSS3 transforms应用于背景图像的解决方法
2019/04/16 HTML / CSS
HTML5 CSS3新的WEB标准和浏览器支持
2009/07/16 HTML / CSS
data:image data url 文件转为Blob上传后端的方法
2019/07/16 HTML / CSS
自荐书封面下载
2013/11/29 职场文书
优秀护士演讲稿
2014/04/30 职场文书
班级口号大全
2014/06/09 职场文书
大学生职业生涯十年规划书范文
2014/09/17 职场文书
合法的离婚协议书范本
2014/10/23 职场文书
2014年库房工作总结
2014/11/26 职场文书
工程资料员岗位职责
2015/04/13 职场文书
情侣之间的道歉短信
2015/05/12 职场文书
2019最新企业员工考勤管理制度(通用版)!
2019/07/02 职场文书