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 相关文章推荐
HTML5如何适配 iPhone IOS 底部黑条
Mar 09 HTML / CSS
详解CSS3中使用gradient实现渐变效果的方法
Aug 18 HTML / CSS
css3 中的新特性加强记忆详解
Apr 16 HTML / CSS
CSS3 分类菜单效果
May 27 HTML / CSS
CSS3实现文字描边的2种方法(小结)
Feb 14 HTML / CSS
CSS实现聊天气泡效果
Apr 26 HTML / CSS
HTML5新控件之日期和时间选择输入的实现代码
Sep 13 HTML / CSS
Html5 语法与规则简要概述
Jul 29 HTML / CSS
HTML5 canvas基本绘图之绘制五角星
Jun 27 HTML / CSS
如何让pre和textarea等HTML元素去掉滚动条自动换行自适应文本内容高度
Aug 01 HTML / CSS
AmazeUI的JS表单验证框架实战示例分享
Aug 21 HTML / CSS
HTML5输入框下拉菜单功能的示例代码
Sep 08 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中使用XML
2006/10/09 PHP
用PHP实现验证码功能
2006/10/09 PHP
php将access数据库转换到mysql数据库的方法
2014/12/24 PHP
PDO防注入原理分析以及注意事项
2015/02/25 PHP
php利用ob_start()清除输出和选择性输出的方法
2018/01/18 PHP
php和redis实现秒杀活动的流程
2019/07/17 PHP
asp(javascript)全角半角转换代码 dbc2sbc
2009/08/06 Javascript
扩展jQuery 键盘事件的几个基本方法
2009/10/30 Javascript
分享JavaScript获取网页关闭与取消关闭的事件
2013/12/13 Javascript
jquery无法设置checkbox选中即没有变成选中状态
2014/03/27 Javascript
JS实现把鼠标放到链接上出现滚动文字的方法
2016/04/06 Javascript
仅9张思维导图帮你轻松学习Javascript 就这么简单
2016/06/01 Javascript
JS获取填报扩展单元格控件的值的解决办法
2017/07/14 Javascript
Vue.js devtool插件安装后无法使用的解决办法
2017/11/27 Javascript
mpvue项目中使用第三方UI组件库的方法
2018/09/30 Javascript
JavaScript表格隔行变色和Tab标签页特效示例【附jQuery版】
2019/07/11 jQuery
layui表格分页 记录勾选的实例
2019/09/02 Javascript
jquery实现手风琴案例
2020/05/04 jQuery
jQuery使用jsonp实现百度搜索的示例代码
2020/07/08 jQuery
[40:12]Liquid vs Chaos 2019国际邀请赛小组赛 BO2 第二场 8.15
2019/08/16 DOTA
Python入门篇之对象类型
2014/10/17 Python
深入理解Python变量与常量
2016/06/02 Python
Python基于贪心算法解决背包问题示例
2017/11/27 Python
使用python将图片格式转换为ico格式的示例
2018/10/22 Python
django 多对多表的创建和插入代码实现
2019/09/09 Python
通过实例了解Python异常处理机制底层实现
2020/07/23 Python
英国工具中心:UK Tool Centre
2017/07/10 全球购物
Lampegiganten丹麦:欧洲领先的照明网上商店
2018/04/25 全球购物
初入社会应届生求职信
2013/11/18 职场文书
支教自我鉴定
2014/01/18 职场文书
好矿嫂事迹材料
2014/01/21 职场文书
幼儿园数学教学反思
2014/02/02 职场文书
党员干部形式主义个人整改措施
2014/09/17 职场文书
热情服务标语
2014/10/07 职场文书
Python字典和列表性能之间的比较
2021/06/07 Python
利用JuiceFS使MySQL 备份验证性能提升 10 倍
2022/03/17 MySQL