HTML 4.01 的script属性

charset: 可选。指定src引入代码的字符集,大多数浏览器忽略该值。

defer: boolean, 可选。延迟脚本执行,相当于将script标签放入页面body标签的底部,js脚本会在document的DOMContentLoaded之前执行。除IE和较新版本的Firefox外,其他浏览器并未支持。

language: 已废弃。大部分浏览器会忽略该值。

src: 可选。指定引入的外部代码文件,不限制后缀名。

type: 必选。指定脚本的内容类型(MIME类型)。现实中通常不指定该值也可以,浏览器会默认当作text/javascript类型来解释执行。

HTML5中的script属性:

script 标签在HTML5中除了具备HTML5新标准定义的属性以外,和HTML4.01相比移除了language属性,修改了type属性为可选的(默认text/javascript),并新增了一个属性async。

async :boolean, 属性的作用,定义脚本是否异步执行,取值true或false。 如果 async 设为 true ,会忽略 defer 属性。

异步执行的 js 文件被假定为不使用 document.write() 向加载中的 document 写入内容,因此不要在 异步执行的 js 文件的加载执行过程中使用 document.write()。

除了 script 标签属性外,页面引入 js 文件的方式影响其加载执行方式:

任何以添加 script 节点(例如 appendChild(scriptNode) ) 的方式引入的js文件都是异步执行的(scriptNode 需要插入document中,只创建节点和设置 src 是不会加载 js 文件的,这跟 img 的预加载不同)。

html文件中的<script>标签中的代码或src引用的js文件中的代码是同步加载和执行的。

html文件中的<script>标签中的代码使用document.write()方式引入的js文件是异步执行的。

html文件中的<script>标签src属性所引用的js文件的代码内再使用document.write()方式引入的js文件是同步执行的。

使用 Image 对象异步预加载 js 文件不会被执行。

不要使用类似下面这种做法,这样并不会发起加载 js 文件的请求:

divNode.innerHTML = '<script src="xxx.js"></script>';

window.onload 事件会在 js 文件加载完毕才触发(即使是异步加载)。

代码示例

html文件中的<script>标签中的代码或src引用的js文件中的代码是同步加载和执行的

 <script>
//同步加载执行的代码
</script>
 <script src="xx.js"></script> //同步加载执行 xx.js 中的代码 

html文件中的<script>标签中的代码使用document.write()方式引入的js文件是异步执行的

 <script>
document.write('<script src="xx.js"><\/script>'); //异步加载执行 xx.js 中的代码
</script>

html 文件中的<script>标签 src 属性所引用的 js 文件的代码内再使用 document.write() 方式引入的 js 文件是同步执行的

 <script src="xx.js"></script>
2 // xx.js中有下面代码:
// document.write('<script src="11.js"><\/script>');
// document.write('<script src="22.js"><\/script>'); // xx.js 和 11.js、22.js 都是同步加载和执行的。
7 // 如果 xx.js 以 script 节点方式异步加载, 11.js 和 22.js 以 document.write(script) 方式加载,则 11.js 和 22.js 是同步加载的
// 测试:在11.js中 alert()(不要用 for 循环,浏览器是单线程执行的,持续执行任何一段代码都会导致其余代码被阻塞) , 22.js 中 console.log() ,可以看到 22.js 中的代码被阻塞

以添加 script 节点的方式引入的 js 文件会在 appendChild 执行之后异步加载执行

 var script = document.createElement("script");
script.setAttribute("src","xx.js");
documenrt.getElementsByTagName("head")[0].appendChild(script);

使用 Image 对象异步预加载 js 文件(不会被执行) 
Image 的 src 被赋值时即发起请求,而且对文件类型不挑剔(图片也可能是有脚本动态创建的,比如验证码),因此可以将 js 文件的 url 赋给 image.src, js 加载之后被浏览器缓存.

 var img = new Image();
img.onload = function(){ alert(1); } ; //由于返回的 js 文件 MIME 不是图片,onload 回调函数并不会被触发
img.src = 'http://localhost/test/loadjs/try.2.js';
var s = document.createElement("script");
var h = document.getElementsByTagName("head")[0];
//执行 js
s.src=img.src;
h.appendChild(s);
 

加载 js 文件的代码例子:

 var loadJS = function(url, callback){  
2 var script = document.createElement('script'); script.src = url;
script.type = "text/javascript";
if ( script.onreadystatechange ) {    // IE 下的 script 标签有 onreadystatechange 事件,无 onload 事件
script.onreadystatechange = function(){
  if ( this.readyState == "complete" || this.readyState == "loaded" ){
      script.onreadystatechange = null;
       callback();
     }
};
  } else {      // W3C 标准的 script 标签没有 onreadystatechange 和 this.readyState 除 IE 外其他浏览器
14      script.onload = function(){ // 文件加载成功则触发 onload
15        callback();
16      }
17   }
18   document.body.appendChild( script);
19 }

测试:

对于 "html 文件中的 <script> 标签 src 属性所引用的 js 文件的代码内再使用 document.write() 方式引入的 js 文件是同步执行的" 的测试(同步加载)(其中插入 alert 很容易看到加载时的阻塞)

HTML:
 <!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<script src="tryjs.js"  
onload="if(!document.all){console.log('outer js callback, not IE');}"
onreadystatechange="console.log('outer js callback ',this.readyState,' IE');"></script>
<body>
</body>
</html>

js:

 console.log('write begin');
document.write('<script src="try.1.js" onreadystatechange="console.log(\'file 1 callback \',this.readyState,\' IE\');" onload="if(!document.all){console.log(\'file 1 callback,NOT IE \');}"><\/script>');
document.write('<script src="try.2.js" onreadystatechange="console.log(\'file 2 callback \',this.readyState,\' IE\');" onload="if(!document.all){console.log(\'file 2 callback,NOT IE \');}"><\/script>');
console.log('write finished');

try.1.js

console.log('loadjs 1 begin'); 
console.log('loadjs 1 finished'); 

try.2.js

console.log('loadjs 2 begin'); 
console.log('loadjs 2 finished'); 

测试结果(file 2 和 file 1 的 callback complete 在IE7\8\9次序不确定) 
IE 7: 
日志: outer js callback loading IE 
日志: outer js callback loaded IE 
日志: write begin 
日志: write finished 
日志: outer js callback complete IE 
日志: file 1 callback loading IE 
日志: file 2 callback loading IE 
日志: loadjs 1 begin 
日志: loadjs 1 finished 
日志: loadjs 2 begin 
日志: loadjs 2 finished 
日志: file 2 callback complete IE 
日志: file 1 callback complete IE

IE8: 
日志: outer js callback loading IE 
日志: outer js callback loaded IE 
日志: write begin 
日志: write finished 
日志: outer js callback complete IE 
日志: file 1 callback loading IE 
日志: file 2 callback loading IE 
日志: loadjs 1 begin 
日志: loadjs 1 finished 
日志: loadjs 2 begin 
日志: loadjs 2 finished 
日志: file 2 callback complete IE 
日志: file 1 callback complete IE

IE9: 
日志: write begin 
日志: write finished 
日志: outer js callback complete IE 
日志: file 1 callback loading IE 
日志: file 2 callback loading IE 
日志: loadjs 1 begin 
日志: loadjs 1 finished 
日志: loadjs 2 begin 
日志: loadjs 2 finished 
日志: file 1 callback complete IE 
日志: file 2 callback complete IE

FIREFOX: 
write begin 
write finished 
outer js callback, not IE 
loadjs 1 begin 
loadjs 1 finished 
file 1 callback,NOT IE 
loadjs 2 begin 
loadjs 2 finished 
file 2 callback,NOT IE

CHROME: 
write begin 
write finished 
outer js callback, not IE 
loadjs 1 begin 
loadjs 1 finished 
file 1 callback,NOT IE 
loadjs 2 begin 
loadjs 2 finished 
file 2 callback,NOT IE

javascript 同步加载与异步加载的更多相关文章

  1. 【UE4 C++ 基础知识】<11>资源的同步加载与异步加载

    同步加载 同步加载会造成进程阻塞. FObjectFinder / FClassFinder 在构造函数加载 ConstructorHelpers::FObjectFinder Constructor ...

  2. Javascript 文件的同步加载与异步加载

    HTML 4.01 的script属性 charset: 可选.指定src引入代码的字符集,大多数浏览器忽略该值.defer: boolean, 可选.延迟脚本执行,相当于将script标签放入页面b ...

  3. 关于requireJS的同步加载和异步加载

    这篇随笔主要记录require('name')和require(['name1','name2'])在同步和异步加载使用的区别 1.require('name')同步加载模块的形式 define(fu ...

  4. AJAX中的同步加载与异步加载

    AJAX是四个单词的简写,其中Asynchronous即异步的意思,异步的链接可以同时发起多个,并且不会阻止JS代码执行.与之对应的概念是同步,同步的链接在同一时刻只会有一个,并且会阻止后续JS代码的 ...

  5. Jquery前端分页插件pagination同步加载和异步加载

    上一篇文章介绍了Jquery前端分页插件pagination的基本使用方法和使用案例,大致原理就是一次性加载所有的数据再分页.https://www.jianshu.com/p/a1b8b1db025 ...

  6. 动态加载(异步加载)jquery/MUI类库 页面加载完成后加载js类库

    动态加载Mui类库: // ==UserScript== // @name // @version 1.4.0 // @author zzdhidden@gmail.com // @namespace ...

  7. JS的同步加载、异步加载

    在使用js展开式菜单时,发现只有加载完页面包含的js文件时,展开菜单才能折叠起来. 查找了一下原因:是因为js页面加载使用的是同步模式,又称阻塞模式,会阻止浏览器的后续处理,停止后续的解析,只有当当前 ...

  8. 图解script的三种加载方式 异步加载顺序

    摘录如下: 可以很清晰的看出: <script>: 脚本的获取和执行是同步的.此过程中页面被阻塞,停止解析. <script defer = "defer"> ...

  9. [原创]cocos2dx加载网络图片&异步加载图片

    [动机] 之前看到一款卡牌游戏,当你要看全屏高清卡牌的时候,游戏会单独从网络上下载,本地只存了非高清的,这样可以省点包大小,所以我萌生了实现一个读取网络图片的类. [联想] 之前浏览网页的时候经常看到 ...

随机推荐

  1. DBA_Oracle Event等待事件分析(概念)

    2014-12-18 Created By BaoXinjian

  2. linux中deb怎样安装

    deb是Debian Linux的安装格式,跟Red Hat的rpm非常相似,最基本的安装命令是:dpkg -i file.debdpkg 是Debian Package的简写,是为Debian 专门 ...

  3. mysql常用脚本

    1.执行拼接字符串sql语句(可传参数) set @dbname='trickraft_14f.'; set @sql=CONCAT('SELECT * FROM ',@dbname,'Armforc ...

  4. Python进阶04 函数的参数对应

    作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 我们已经接触过函数(function)的参数(arguments)传递.当时我们根 ...

  5. $(document).ready() 与 window.onload的区别

    1.执行时间 window.onload 必须等到页面内所有元素(包括图片 css js等)加载完毕后才会执行. $(document).ready() 是DOM结构绘制完毕后就执行,不必等到所有元素 ...

  6. Intellisense in Visual Studio for Microsoft Dynamics CRM 2016

    Intellisense in Visual Studio for Microsoft Dynamics CRM 2016 posted by dynamicsnick on may 18, 2016 ...

  7. Django下载中文名文件:

    Django下载中文名文件: from django.utils.http import urlquote from django.http import HttpResponse content = ...

  8. [技巧]如何清除VS2008的最近打开项目

    )删除最近打开的文件 运行regedit,打开HKEY_CURRENT_USER\Software\Microsoft\VisualStudio\9.0\FileMRUList 之后,在右边删除相应键 ...

  9. svn排除不想要的目录上传的实践技巧

    使用SVN时,经常会遇到,有些目录,上传到SVN上,不想最持同步中,尤其像.net中的bin.obj目录,在网上找了很多资料,都是说setting-->General-->Subversi ...

  10. 一个构建XML对象的js库

    初学javascript,学习中用到在IE中建立XML对象,于是写了一个简单的“库”.因为水平所限,肯定会有不恰当的地方,欢迎指正. 如果大家有知道现存的更好的东西,非常希望大家能将它推荐给我. 代码 ...