html5中script的async属性

我兴奋于html5的原因之一是一些久久未能实现的特性现在可以真正运用于实际项目中了. 如我们使用placeholder效果蛮久了但是那需要javascript来实现. 目前firefox和chrome都是实现了script标签的async属性.这个新的属性能让我们以一种更 简单的方式防止浏览器阻塞,在这之前我们需要用一些javascript小窍门来解决这个问题.

async - html代码

<script async src="myscript.js" onload="myInit()"></script>

就像我之前提到的,加个属性很容易.

defer - html代码

script标签也有个defer属性,目前所有浏览器都已实现, 在firefox和chrome的早期版本没有实现此属性,IE从一开始就支持此属性.

<script defer src="myscript.js" onload="myInit()"></script>

async & defer - 它们的区别是什么

带有async或者defer的script都会立刻下载并不阻塞页面解析,而且都提供一个可选的onload事件处理, 在script下载完成后调用,用于做一些和此script相关的初始化工作.它们的不同之处在于script执行的 时机.带有async的script,一旦下载完成就开始执行(当然是在window的onload之前).这意味着这些script 可能不会按它们出现在页面中的顺序来执行,如果你的脚本互相依赖并和执行顺序相关,就有很大的可能出问题, 例如变量或者函数未定义之类的错误. 而对于带有defer的script,它们会确保按在页面中出现的顺序来执行,它们执行的时机是在页面解析完后,但在 DOMContentLoaded事件之前.(亲测下来确实如此,下面会给出我的测试用例和说明)

目前哪些浏览器支持defer和async

目前来看,最新版本的firefox和chrome(还有同样webkit内核的safari,本人机器上的版本是ff6,chrome15dev-m,IE9)都已支持这两个属性,也都支持script的load事件. IE的话对于defer是一直都支持的,async属性IE6~9都没有支持(IE10毫无疑问的会支持),onload是在IE9中新加入的属性.

--------------------下面来一些我对defer,async,onload的测试用例------------------------------

写了简单的四段脚本用于测试

		/** script1 **/
window.ns = {};
window.ns.delay = function(n) {
var start = Number(new Date()),
wait = n * 1000;
while(true) {
var end = Number(new Date());
if(end-start >= wait) {
break;
}
}
console.log("take " + n + " seconds to execute");
};
console.log("create a namespace named ns");
document.addEventListener("DOMContentLoaded", function() {
console.log("oh yeah, Dom Ready!");
}, false);
window.addEventListener("load", function() {
console.log("oh yeah, All Resources Loaded!");
}, false);
		/** script2 **/
if(window.ns) {
window.ns.one = 'ONE';
console.log('window.ns.one:' + window.ns.one);
window.ns.delay(2);
} else {
console.log('oops...');
}
		/** script3 **/
if(window.ns && window.ns.one) {
window.ns.two = "TWO";
console.log('window.ns.two:' + window.ns.two);
window.ns.delay(2);
} else {
console.log('oops...');
}
		/** script4 **/
if(window.ns && window.ns.two) {
window.ns.three = "THREE";
console.log('window.ns.three:' + window.ns.three);
} else {
console.log('oops...');
}

用于测试的基本html页面

   <!DOCTYPE htm>
<html>
<head>
<meta charset="utf-8">
<title>test</title>
<script type="text/javascript" src="script1.js"></script>
<script type="text/javascript" src="script2.js"></script>
<script type="text/javascript" src="script3.js"></script>
<script type="text/javascript" src="script4.js"></script>
</head>
<body>
<img src="http://img9.zol.com.cn/desk_pic/big_452/451134.jpg"
width="200" height="200" alt="a big image of beauty"/>
</body>
</html>

剩下的事情就是在script上加上defer和async进行测试

1.无defer和async属性

	<script type="text/javascript" src="script1.js"></script>
<script type="text/javascript" src="script2.js"></script>
<script type="text/javascript" src="script3.js"></script>
<script type="text/javascript" src="script4.js"></script>

我们先看资源加载瀑布图(firefox和chrome类似,IE9的有点奇怪):

看得出来image的下载被script的执行给阻塞了.

console输出如下:

2.都给上defer属性

<script type="text/javascript" src="script1.js" defer></script>
<script type="text/javascript" src="script2.js" defer></script>
<script type="text/javascript" src="script3.js" defer></script>
<script type="text/javascript" src="script4.js" defer></script>

资源加载瀑布图:

看得出来所有资源进行了并行下载,没有阻塞img的情况

console输出和第1个测试的输出一致,IE9和chrome是如此,但是奇怪的是Firefox在这种情况下, 居然没有触发DOMContentLoaded事件,即输出少了Dom Ready!一行

3.部分给上defer属性

<script type="text/javascript" src="script1.js"></script>
<script type="text/javascript" src="script2.js" defer></script>
<script type="text/javascript" src="script3.js" ></script>
<script type="text/javascript" src="script4.js" defer></script>

因为这里面4个script都是有执行顺序依赖的,所以如果defer属性不加选择的添加的话,就会出麻烦, 本例中,script1和script3就会先执行,script2和script4晚执行,就出现错误了

console输出如下:

4.都给上async属性

<script type="text/javascript" src="script1.js" async></script>
<script type="text/javascript" src="script2.js" async></script>
<script type="text/javascript" src="script3.js" async></script>
<script type="text/javascript" src="script4.js" async></script>

IE9根本不支持这个,所以不用测试. Firefox和chrome都是第一次访问时,出现了异步执行的情况, 之后有缓存的话script的执行顺序貌似得到了维护.资源时间瀑布上 表现出的是预期的情况,即没有给其他资源的下载造成阻塞

Chrome中第一次访问,console输出如下,无论出错与否chrome和firefox的DOMContentLoaded均未未触发

5.部分给async属性

<script type="text/javascript" src="script1.js" async></script>
<script type="text/javascript" src="script2.js"></script>
<script type="text/javascript" src="script3.js"></script>
<script type="text/javascript" src="script4.js" async></script>

这种情况的效果在chrome下比较明显,分析起来也很简单,4个script都是并行下载,但是如果script1和script4下完后立马执行, 很显然就破环了它们之间的依赖关系,可惜的是这种竞争的现象在Firefox中出现的概率比较低,可能跟firefox的缓存机制有关系

chrome的console输出如下:

关于script的onload属性会另外写一篇文章来记录.

最后,如果您有什么疑问或者发现文中有错误,欢迎指出,共同进步

html5中script的async属性的更多相关文章

  1. HTML5中script的async属性异步加载JS

    HTML5中script的async属性异步加载JS     HTML4.01为script标签定义了5个属性: charset 可选.指定src引入代码的字符集,大多数浏览器忽略该值.defer 可 ...

  2. HTML5特性:使用async属性异步加载执行JavaScript

    HTML5让我兴奋的一个最大的原因是,它里面实现的新功能和新特征都是我们长久以来一直期待的.比如,我以前一直在使用placeholders,但以前必须要用JavaScript实现.而HTML5里给Ja ...

  3. script标签中defer和async属性的区别

    这篇文章来源于JS高级程序设计第三版中关于script标签的介绍,结合查阅的资料写下的学习笔记. 向html页面中插入javascript代码的主要方法就是通过script标签.其中包括两种形式,第一 ...

  4. HTML中<script>的defer属性与async属性

    defer 属性会在 DOMLoaded 事件之前完成异步加载,加载不会阻塞 DOM 解析,并且 script 的顺序会按照 DOM 中的顺序加载. async 属性就是异步加载,没有什么顺序的保证.

  5. 【HTML5 】<script>元素async,defer异步加载

    原文地址:HTML5′s async Script Attribute原文日期: 2010年09月22日翻译日期: 2013年08月22日 (译者注: 异步加载,可以理解为无阻塞并发处理.) (译者再 ...

  6. html5中常见的全局属性

    1.contentEditable属性 1.功能说明 (1)功能:允许用户编辑元素中的内容 (2)说明:是一个布尔值,false是不能编辑,true为可编辑 该元素还隐藏一个inherit状态  也是 ...

  7. html5中新的标准属性

    属性                                        值                                  描述accesskey             ...

  8. HTML5中 基本用法及属性 韩俊强的博客

    从今天开始更新H5相关学习:希望大家能一起学习,多学习一门语言,多一门乐趣! 了解Html5: Html5基本属性: <!DOCTYPE html> <html lang=" ...

  9. html5中 input的pattern属性 和 details/summary元素

    html5--3.21 课程小结与其他新增元素 一.总结 一句话总结: input的pattern属性可以设置正则验证,比如检测学号的位数和数字区间 details/summary元素配合起来可以做元 ...

随机推荐

  1. Python源代码 -- C语言实现面向对象编程(基类&amp;派生类&amp;多态)

    背景 python是面向对象的解释性语言.然而python是通过C语言实现的,C语言怎么跟面向对象扯上了关系? C语言能够实现面向对象的性质? 原文链接:http://blog.csdn.net/or ...

  2. Java程序调用带参数的shell脚本返回值

    Java程序调用带参数的shell脚本返回值 首先来看看linux中shell变量(\(#,\)@,$0,$1,\(2)的含义解释 变量说明: -  \)$  Shell本身的PID(ProcessI ...

  3. 翻译记忆软件-塔多思TRADOS经典教程_1

    窗体顶端 网络上关于TRADOS使用的文章很多,但大多数内容涉及的内容都过于广泛,刚准备上手的同行们看了总会觉得不知所云,无从下手.笔者自己也在自学阶段遇到不少麻烦.经过长期的使用和琢磨,终于写了短文 ...

  4. HTML5 坦克大战

    代码 点击打开链接

  5. Effective C++ 38-42

    38.绝不要又一次定义继承而来的缺省參数值. 又一次定义函数缺省參数值意味着又一次定义函数.而非虚函数不能又一次定义,所以将就考虑不能又一次定义虚函数的缺省參数值的原因:虚函数是动态绑定的而缺省參数值 ...

  6. posix_memalign详细解释(转)——自定义对齐大小的内存分配函数

    转载:http://hi.baidu.com/freelonely/blog/item/340341077c4d287302088189.html 预对齐内存的分配 在大多数情况下,编译器和C库透明地 ...

  7. idea 修改编辑区字体样式、大小

      idea 修改编辑区字体样式.大小 CreateTime--2018年4月26日10:36:59 Author:Marydon 设置-->Editor-->Font-->修改Fo ...

  8. Linux下动态共享库加载时的搜索路径详解

    对动态库的实际应用还不太熟悉的读者可能曾经遇到过类似“error while loading shared libraries”这样的错误,这是典型的因为需要的动态库不在动态链接器ld.so的搜索路径 ...

  9. iOS自定义从底部弹上来的View

    概述 自定义蒙层弹起View,点击一下遮罩或界面上关闭按钮,页面会自动下去(从上向下) 详细 代码下载:http://www.demodashi.com/demo/10724.html 在一些少数据没 ...

  10. Android 线性布局(LinearLayout)相关官方文档 - 指南部分

    Android 线性布局(LinearLayout)相关官方文档 - 指南部分 太阳火神的漂亮人生 (http://blog.csdn.net/opengl_es) 本文遵循"署名-非商业用 ...