一般來說如果一次性的載入所有需要的JavaScript代碼,就會造成初始網頁打開速度變慢,但是很多載入的代碼又並不需要使用,這種無謂的性能浪費應該予以避免。如果要動態載入JavaScript代碼,可以利用DOM模型在HTML文檔中添加<script>結點,並將此結點的src屬性(即 外聯 Javascript文件)設置為需要動態載入的JavaScript代碼。
下面就是完成這樣功能的一個示例:
(1)、新建JsLoaderTest.html文件
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
<title>按需載入JavaScript代碼的例子</title>
<script type="text/javascript">
function JsLoader(){
this.load=function(url){
//獲取所有的<script>標記
var ss=document.getElementsByTagName("script");
//判斷指定的文件是否已經包含,如果已包含則觸發onsuccess事件並返回
for (i=0;i<ss.length;i++){
if (ss[i].src && ss[i].src.indexOf(url)!=-1){
this.onsuccess();
return;
}
}
//創建script結點,並將其屬性設為外聯JavaScript文件
s=document.createElement("script");
s.type="text/javascript";
s.src=url;
//獲取head結點,並將<script>插入到其中
var head=document.getElementsByTagName("head")[0];
head.appendChild(s);
//獲取自身的引用
var self=this;
//對於IE浏覽器,使用readystatechange事件判斷是否載入成功
//對於其他浏覽器,使用onload事件判斷載入是否成功
//s.onload=s.onreadystatechange=function(){
s.onload=s.onreadystatechange=function(){
//在此函數中this指針指的是s結點對象,而不是JsLoader實例,
//所以必須用self來調用onsuccess事件,下同。
if (this.readyState && this.readyState=="loading") return;
self.onsuccess();
}
s.onerror=function(){
head.removeChild(s);
self.onfailure();
}
};
//定義載入成功事件
this.onsuccess=function(){};
//定義失敗事件
this.onfailure=function(){};
}
function btnClick(){
//創建對象
var jsLoader=new JsLoader();
//定義載入成功處理程序
jsLoader.onsuccess=function(){
sayHello();
}
//定義載入失敗處理程序
jsLoader.onfailure=function(){
alert("文件載入失敗!");
}
//開始載入
jsLoader.load("hello.js");
}
</script>
</head>
<body>
<label>
<input type="submit" name="Submit" onClick="javascript:btnClick()" value="載入JavaScript文件">
</label>
</body>
</html>
(2)、新建hello.js文件,包含如下代碼:
// JavaScript Document
function sayHello(){
alert("Hello World!成功載入JavaScript文件");
}
// JavaScript Document
function sayHello(){
alert("Hello World!成功載入JavaScript文件");
}