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将文字描边及填充文字颜色的方法
Mar 07 HTML / CSS
详解css3自定义滚动条样式写法
Dec 25 HTML / CSS
css3实例教程 一款纯css3实现的发光屏幕旋转特效
Dec 07 HTML / CSS
浅析与CSS3的loading动画加载相关的transition优化
May 18 HTML / CSS
基于ccs3的timeline时间线实现方法
Apr 30 HTML / CSS
CSS 3.0 结合video视频实现的创意开幕效果
Jun 01 HTML / CSS
HTML5实现Notification API桌面通知功能
Mar 02 HTML / CSS
html5使用canvas实现弹幕功能示例
Sep 11 HTML / CSS
如何用canvas实现在线签名的示例代码
Jul 10 HTML / CSS
HTML5拖拽功能实现的拼图游戏
Jul 31 HTML / CSS
html5移动端价格输入键盘的实现
Sep 16 HTML / CSS
Html5同时支持多端sdk的小技巧
Nov 17 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
php上传文件的增强函数
2010/07/21 PHP
php使用session二维数组实例
2014/11/06 PHP
php使用NumberFormatter格式化货币的方法
2015/03/21 PHP
php实现图片等比例缩放代码
2015/07/23 PHP
js去除输入框中所有的空格和禁止输入空格的方法
2014/06/09 Javascript
javascript折半查找详解
2015/01/26 Javascript
针对初学者的jQuery入门指南
2015/08/15 Javascript
Javascript实现检测客户端类型代码封包
2015/12/03 Javascript
this,this,再次讨论javascript中的this,超全面(经典)
2016/01/05 Javascript
微信小程序(应用号)简单实例应用及实例详解
2016/09/26 Javascript
原生Javascript插件开发实践
2017/01/18 Javascript
Vue过滤器的用法和自定义过滤器使用
2017/02/08 Javascript
JavaScript切换搜索引擎的导航网页搜索框实例代码
2017/06/11 Javascript
nodejs接入阿里大鱼短信验证码的方法
2017/07/10 NodeJs
Vue数据双向绑定原理及简单实现方法
2018/05/18 Javascript
jQuery模拟12306城市选择框功能简单实现方法示例
2018/08/13 jQuery
react native 获取地理位置的方法示例
2018/08/28 Javascript
解决vue axios的封装 请求状态的错误提示问题
2018/09/25 Javascript
微信小程序五子棋游戏的棋盘,重置,对弈实现方法【附demo源码下载】
2019/02/20 Javascript
react 移动端实现列表左滑删除的示例代码
2019/07/04 Javascript
JavaScript中BOM对象原理与用法分析
2019/07/09 Javascript
JavaScript剩余操作符Rest Operator详解
2019/07/20 Javascript
el-select 下拉框多选实现全选的实现
2019/08/02 Javascript
elementui实现预览图片组件二次封装
2020/12/29 Javascript
python使用正则表达式检测密码强度源码分享
2014/06/11 Python
用Python编写一个基于终端的实现翻译的脚本
2015/04/24 Python
Python微信库:itchat的用法详解
2017/08/14 Python
Python+selenium 获取浏览器窗口坐标、句柄的方法
2018/10/14 Python
python 实现在tkinter中动态显示label图片的方法
2019/06/13 Python
详细介绍Python进度条tqdm的使用
2019/07/31 Python
python 实现手机自动拨打电话的方法(通话压力测试)
2019/08/08 Python
浅析PEP572: 海象运算符
2019/10/15 Python
html5实现canvas阴影效果示例
2014/05/07 HTML / CSS
小学教师师德感言
2014/02/10 职场文书
2014年商场国庆节活动策划方案
2014/09/16 职场文书
python实现简单的名片管理系统
2021/04/26 Python