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实现图片无间断轮播效果
Aug 25 HTML / CSS
CSS3支持IE6, 7, and 8的边框border属性
Dec 28 HTML / CSS
CSS3实现时间轴效果
Jul 11 HTML / CSS
CSS3利用text-shadow属性实现多种效果的文字样式展现方法
Aug 25 HTML / CSS
css3 利用transform打造走动的2D时钟
Oct 20 HTML / CSS
html5使用Canvas绘图的使用方法
Nov 21 HTML / CSS
5分钟弄清楚html5的drag and drop(小结)
Apr 10 HTML / CSS
使用CSS实现弹性视频html5案例实践
Dec 26 HTML / CSS
用HTML5制作烟火效果的教程
May 12 HTML / CSS
HTML5实现移动端复制功能
Apr 19 HTML / CSS
HTML5中form如何关闭自动完成功能的方法
Jul 02 HTML / CSS
使用canvas实现雪花飘动效果的示例代码
Mar 30 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
MongoDB在PHP中的常用操作小结
2014/02/20 PHP
ThinkPHP让分页保持搜索状态的方法
2014/07/02 PHP
PHP最常用的正则表达式
2017/02/13 PHP
浅谈PHP中类和对象的相关函数
2017/04/26 PHP
PHP PDOStatement::getColumnMeta讲解
2019/02/01 PHP
使用javascript获取flash加载的百分比的实现代码
2011/05/25 Javascript
JS复制内容到剪切板的实例代码(兼容IE与火狐)
2013/11/19 Javascript
利用js(jquery)操作Cookie的方法说明
2013/12/19 Javascript
js检测浏览器版本、核心、是否移动端示例
2014/04/24 Javascript
Bootstrap入门书籍之(四)菜单、按钮及导航
2016/02/17 Javascript
微信小程序 scroll-view实现上拉加载与下拉刷新的实例
2017/01/21 Javascript
基于cropper.js封装vue实现在线图片裁剪组件功能
2018/03/01 Javascript
小程序自定义日历效果
2018/12/29 Javascript
vue无限轮播插件代码实例
2019/05/10 Javascript
微信小程序实现张图片合成为一张并下载
2019/07/16 Javascript
js 计数排序的实现示例(升级版)
2020/01/12 Javascript
js实现自定义右键菜单
2020/05/18 Javascript
Vue全局使用less样式,组件使用全局样式文件中定义的变量操作
2020/10/21 Javascript
使用django-suit为django 1.7 admin后台添加模板
2014/11/18 Python
Python Requests库基本用法示例
2018/08/20 Python
python调用c++ ctype list传数组或者返回数组的方法
2019/02/13 Python
python tkinter实现屏保程序
2019/07/30 Python
Python新手学习函数默认参数设置
2020/06/03 Python
python多线程和多进程关系详解
2020/12/14 Python
英国天然保健品网站:Simply Supplements
2017/03/22 全球购物
Oroton中国官网:澳洲知名奢侈配饰品牌
2017/03/26 全球购物
friso美素佳儿官方海外旗舰店:荷兰原产原罐
2017/07/03 全球购物
JAVA代码查错题
2014/10/10 面试题
安全负责人任命书
2014/06/06 职场文书
优秀员工评优方案
2014/06/13 职场文书
会议室标语
2014/06/21 职场文书
违章停车检讨书
2014/10/21 职场文书
服务员岗位职责范本
2015/04/09 职场文书
七一慰问简报
2015/07/20 职场文书
助学金申请书该怎么写?
2019/07/16 职场文书
解决ObjectMapper.convertValue() 遇到的一些问题
2021/06/30 Java/Android