加载外部 js 的方法大致有这么几种:
方法 | 说明 |
XHR Eval | 通过 Ajax 方式获取代码,并通过 eval 方式执行代码。 |
XHR Injection | 通过 Ajax 方式获取代码,并在页面上创建一个 script 元素,将 Ajax 取得的代码注入。 |
Script in Iframe | 通过 iframe 加载 js。 |
Script DOM Element | 使用 JavaScript 动态创建 script DOM 元素并设置其 src 属性。 |
Script Defer/Async | 严格来说,这一条不算是动态加载外部脚本的方法,但很多动态加载外部脚本的方法里都会用到 sctipt 的 defer 或 async 属性,所以也把它单独列在这儿。这个方法利用 script 的 defer 属性,让脚本“推迟”执行,不阻塞页面加载,或者设置 async 属性,让脚本异步执行。遗憾的是这两个属性不是所有浏览器都支持。 |
document.write Script Tag | 通过 document.write 把 HTML 标签 script 写入到页面中。 |
cache trick | 先使用自定义的 script 的 type 属性(如 <script type="text/cache" ...),甚至使用 Image、Object 等 HTML 对象将 js “预下载”(下载到浏览器缓存里),等真正需要执行对应代码时再将它真正地插入页面中。 |
Web Worker | 部分浏览器支持 web worker 功能,可以创建一个 worker 在后台工作,包括加载外部脚本。 |
LABjs方法
参数值为:
AlwaysPreserveOrder一个布尔值(默认值为false),控制是否一个隐式空wait()调用假定每个脚本加载后,基本上所有的脚本在链条部队执行串行顺序(加载并联,默认情况下,不受此设置)。
UseLocalXHR 一个布尔值(默认值为true)用ajax XHR来预加载脚本
AllowDuplicates
一个布尔值(缺省为false)控制LABjs是否会检查其内部脚本URL缓存以防止脚本URI被(不小心,很可能)加载一次。默认情况下,LABjs不会让任何重复请求相同的脚本的URL。
BasePath 本地脚本的基本路径
CacheBust一个布尔值(缺省为false)增加了一个随机数字参数,防止每个脚本的URL从你的请求的URL缓存取
Debug 布尔值,用于web控制台将记录$LAB各个步骤的加载/处理逻辑,这个属性只有在引入LABjs源码或者 LAB-debug.min.js文件后才生效
$LAB.setOptions()
设置一个或多个选项只有在影响当前$LAB正在执行链,此方法必须是$LAB链第一个执行方法。参数和setGlobalDefaults()一样。格式为:$LAB.setOptions({...}).script(...)...
$LAB.script() 加载脚本
传递参数:
string 一个相对或者绝对的script地址
object对象 包含如下属性:
src script文件的位置
type指定类型 ("text/javascript", "text/vbscript")
charset指定字符编码
array数组
function函数 如果一个函数是发现作为参数之一,该函数将会被立即执行,必须直接返回一个值。返回值必须是另一个容许类型(字符串、对象或数组)。如果函数调用的结果在任何返回值(“未定义”)或值是“falsy”(false,空等),它将被视为没有脚本加载
$LAB.wait()
这个函数有两个目的。
首先,插入到链,以确保所有脚本之前列出的链应该执行完后继续余下的部分的链。
其次,你可以指定一个函数参考(通常一个内联匿名函数),将按顺序执行的,紧跟着链条之前的脚本执行。
$LAB.queueScript()
把加载的script放到队列里边
$LAB.queueWait()
把执行的函数放到队列列表
$LAB.runQueue()
执行队列里的queueScript()和queueWait()
$LAB.noConflict()
防止$LAB占用
$LAB.sandbox()
sandbox()创建一个新的干净的$LAB。这允许您获取新实例的实验室,比如如果你需要一个新的队列使用queueWai()或 queueScript()。
例子:
例子1:
$LAB.script("script1.js")
.script("script2.js")
.script("script3.js")
.wait(function(){ // 等待所有的脚本执行完毕后才执行下面函数
script1Func();
script2Func();
script3Func();
});
$LAB
.script({ src: "script1.js", type: "text/javascript" })
.script("script2.js")
.script("script3.js")
.wait(function(){ // 等待所有的脚本执行完毕后才执行下面函数
script1Func();
script2Func();
script3Func();
});
$LAB
.script("script1.js", "script2.js", "script3.js")
.wait(function(){ // 等待所有的脚本执行完毕后才执行下面函数
script1Func();
script2Func();
script3Func();
});
$LAB
.script( [ "script1.js", "script2.js" ], "script3.js")
.wait(function(){ // 等待所有的脚本执行完毕后才执行下面函数
script1Func();
script2Func();
script3Func();
});
$LAB
.script("script1.js").wait() // 空wait() 只是简单确定执行顺序
.script("script2.js") // script2和script3依赖script1,必须让script1先执行,而script2和script3没有具体执行顺序
.script("script3.js").wait() // 空wait() 只是简单确定执行顺序
.script("script4.js") // 依赖script1, script2 和 script3,这3个先加载
.wait(function(){script4Func();});//执行脚本4函数
$LAB
.script("script1.js") // script1, script2, 和 script3互补依赖所以没有执行顺序,
.script("script2.js")
.script("script3.js")
.wait(function(){
//执行wait(...) 里的函数functions
alert("Scripts 1-3 are loaded!");
})
.script("script4.js") // 依赖script1, script2 and script3
.wait(function(){script4Func();});
例子7:
$LAB
.setOptions({AlwaysPreserveOrder:true}) //设置每个脚本进行等待wait,即每个脚本彼此依赖
.script("script1.js") // script1, script2, script3, and script4 *DO* depend on each
.script("script2.js") // other, and will execute serially in order after all 4 have have
.script("script3.js") // loaded in parallel
.script("script4.js")
.wait(function(){script4Func();});
$LAB
.script(function(){
// assuming `_is_IE` defined by host page as true in IE and false in other browsers
if (_is_IE) {
return "ie.js"; // only if in IE, this script will be loaded
}
else {
return null; // if not in IE, this script call will effectively be ignored
}
})
.script("script1.js")
.wait();
$LAB
.queueScript("script1.js") // script1, script2, and script3彼此不依赖所以按照任意顺序执行
.queueScript("script2.js")
.queueScript("script3.js")
.queueWait(function(){
//执行wait(...) 函数functions
alert("Scripts 1-3 are loaded!");
})
.queueScript("script4.js") // 依赖 script1, script2 and script3
.queueWait(function(){script4Func();});//执行函数4
// ...
$LAB
.runQueue() // 执行队列$LAB链
.script("script5.js")
.wait(function(){
alert("Script 5 loaded and executed off the end of a previously queued chain.");
});
官网文档
http://labjs.com/documentation.php