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 16 HTML / CSS
css3中的calc函数浅析
Jul 10 HTML / CSS
css3中flex布局宽度不生效的解决
Dec 09 HTML / CSS
HTML5印章绘制电子签章图片(中文英文椭圆章、中文英文椭圆印章)
Jun 03 HTML / CSS
突袭HTML5之Javascript API扩展3—本地存储全新体验
Jan 31 HTML / CSS
HTML5实现锚点时请使用id取代name
Sep 06 HTML / CSS
html5定位并在百度地图上显示的示例
Apr 27 HTML / CSS
实例教程 HTML5 Canvas 超炫酷烟花绽放动画实现代码
Nov 05 HTML / CSS
HTML5 audio标签使用js进行播放控制实例
Apr 24 HTML / CSS
HTML5 Canvas 绘图——使用 Canvas 绘制图形图文教程 使用html5 canvas 绘制精美的图
Aug 31 HTML / CSS
浅谈移动端中的视口(viewport)的具体使用
Apr 13 HTML / CSS
html css3不拉伸图片显示效果
Jun 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
php $_SERVER[&quot;REQUEST_URI&quot;]获取值的通用解决方法
2010/06/21 PHP
PHP 微信支付类 demo
2015/11/30 PHP
php上传后台无法收到数据解决方法
2019/10/28 PHP
为Extjs加加速(javascript加速)
2010/08/19 Javascript
控制页面按钮在后台执行期间不重复提交的JS方法
2013/06/24 Javascript
js实现快速分享功能(你的文章分享工具)
2013/06/25 Javascript
用jQuery与JSONP轻松解决跨域访问的问题
2014/02/04 Javascript
javascript获取浏览器类型和版本的方法(js获取浏览器版本)
2014/03/13 Javascript
《JavaScript DOM 编程艺术》读书笔记之DOM基础
2015/01/09 Javascript
JS实现页面超时后自动跳转到登陆页面
2015/01/19 Javascript
jQuery计算文本框字数及限制文本框字数的方法
2016/03/01 Javascript
AngularJS自定义服务与fliter的混合使用
2016/11/24 Javascript
微信小程序 数据封装,参数传值等经验分享
2017/01/09 Javascript
深入理解js中的加载事件
2017/02/08 Javascript
vue省市区三联动下拉选择组件的实现
2017/04/28 Javascript
Vue.js教程之axios与网络传输的学习实践
2017/04/29 Javascript
javascript过滤数组重复元素的实现方法
2017/05/03 Javascript
vue axios请求超时的正确处理方法
2018/04/02 Javascript
详解Vue的常用指令v-if, v-for, v-show,v-else, v-bind, v-on
2018/10/12 Javascript
JavaScript函数的特性与应用实践深入详解
2018/12/30 Javascript
Nginx设置为Node.js的前端服务器方法总结
2019/03/27 Javascript
状态机的概念和在Python下使用状态机的教程
2015/04/11 Python
python调用百度语音识别api
2018/08/30 Python
python实现一个函数版的名片管理系统过程解析
2019/08/27 Python
Python实现把类当做字典来访问
2019/12/16 Python
Pytorch之contiguous的用法
2019/12/31 Python
python字符串下标与切片及使用方法
2020/02/13 Python
使用Python开发个京东上抢口罩的小实例(仅作技术研究学习使用)
2020/03/10 Python
HTML5 Web Workers之网站也能多线程的实现
2013/04/24 HTML / CSS
英国领先的隐形眼镜在线供应商:Lenstore.co.uk
2019/11/24 全球购物
什么是跨站脚本攻击
2014/12/11 面试题
EJB面试题
2015/07/28 面试题
架构师岗位职责
2013/11/18 职场文书
2014年学校德育工作总结
2014/12/05 职场文书
2015年会计个人工作总结
2015/04/02 职场文书
oracle删除超过N天数据脚本的方法
2022/02/28 Oracle