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 27 HTML / CSS
基于Jquery和Css3代码制作可以缩放的搜索框
Nov 19 HTML / CSS
CSS3中的@keyframes关键帧动画的选择器绑定
Jun 13 HTML / CSS
CSS实现聊天气泡效果
Apr 26 HTML / CSS
css3实现背景模糊的三种方式(小结)
May 15 HTML / CSS
HTML5教程之html 5 本地数据库(Web Sql Database)
Apr 03 HTML / CSS
html5图片上传预览示例分享
Apr 14 HTML / CSS
html5桌面通知(Web Notifications)实例解析
Jul 07 HTML / CSS
用HTML5制作一个简单的弹力球游戏
May 12 HTML / CSS
HTML最新标准HTML5总结(必看)
Jun 13 HTML / CSS
用canvas显示验证码的实现
Apr 10 HTML / CSS
CSS 实现多彩、智能的阴影效果
May 12 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模块 Memcached功能多于Memcache
2011/06/14 PHP
php截取指定2个字符之间字符串的方法
2015/04/15 PHP
php使用CURL不依赖COOKIEJAR获取COOKIE的方法
2015/06/17 PHP
php编写简单的文章发布程序
2015/06/18 PHP
php mysqli查询语句返回值类型实例分析
2016/06/29 PHP
[原创]php集成安装包wampserver修改密码后phpmyadmin无法登陆的解决方法
2016/11/23 PHP
iis 7下安装laravel 5.4环境的方法教程
2017/06/14 PHP
PNGHandler-借助JS让PNG图在IE下实现透明(包括背景图)
2007/08/31 Javascript
Javascript String.replace的妙用
2009/09/08 Javascript
javascript的parseFloat()方法精度问题探讨
2013/11/26 Javascript
jquery使用淘宝接口跨域查询手机号码归属地实例
2013/11/28 Javascript
jQuery带箭头提示框tooltips插件集锦
2014/11/17 Javascript
JavaScript使用Replace进行字符串替换的方法
2015/04/14 Javascript
浅谈JavaScript中数组的增删改查
2016/06/20 Javascript
JavaScript实现的微信二维码图片生成器的示例
2016/10/26 Javascript
JQueryEasyUI框架下的combobox的取值和绑定的方法
2017/01/22 Javascript
vue构建单页面应用实战
2017/04/10 Javascript
angular框架实现全选与单选chekbox的自定义
2017/07/06 Javascript
基于匀速运动的实例讲解(侧边栏,淡入淡出)
2017/10/17 Javascript
详解如何优雅地在React项目中使用Redux
2017/12/28 Javascript
详解vue中使用vue-quill-editor富文本小结(图片上传)
2019/04/24 Javascript
详解nvm管理多版本node踩坑
2019/07/26 Javascript
Node.js实现简单管理系统
2019/09/23 Javascript
微信小程序仿抖音视频之整屏上下切换功能的实现代码
2020/05/24 Javascript
vue中activated的用法
2021/01/03 Vue.js
python读取文件名并改名字的实例
2019/01/07 Python
详解python持久化文件读写
2019/04/06 Python
澳大利亚最大的在线美发和美容零售商之一:My Hair Care & Beauty
2019/08/24 全球购物
公益活动策划方案
2014/01/09 职场文书
校园安全广播稿
2014/02/08 职场文书
2014年污水处理厂工作总结
2014/12/19 职场文书
企业财务人员岗位职责
2015/04/14 职场文书
房地产销售助理岗位职责
2015/04/14 职场文书
2016廉洁从业学习心得体会
2016/01/19 职场文书
Golang 编译成DLL文件的操作
2021/05/06 Golang
Python 阶乘详解
2021/10/05 Python