javascript動態載入JS檔案(支援各種瀏覽器)

來源:互聯網
上載者:User

1、直接document.write

 代碼如下 複製代碼
<script language="javascript">
    document.write("<script src='test.js'></script>");
</script>

2、動態改變已有script的src屬性

 代碼如下 複製代碼
<script src='' id="s1"></script>
<script language="javascript">
    s1.src="test.js"
</script>


3、動態建立script元素

 代碼如下 複製代碼
<script>
    var oHead = document.getElementsByTagName('HEAD').item(0);
    var oScript= document.createElement("script");
    oScript.type = "text/javascript";
    oScript.src="test.js";
    oHead.appendChild( oScript);
</script>

這三種方法都是非同步執行的,也就是說,在載入這些指令碼的同時,首頁面的指令碼繼續運行,如果用以上的方法,那下面的代碼將得不到預期的效果。
要動態載入的JS指令碼:a.js,以下是該檔案的內容。

 代碼如下 複製代碼
var str = "中國";
alert( "這是a.js中的變數:" + str );

下面看參考執行個體

 代碼如下 複製代碼

function loadJs(sid,jsurl,callback){
        var nodeHead = document.getElementsByTagName('head')[0];
        var nodeScript = null;
        //不存在載入
        if(document.getElementById(sid) == null){
                nodeScript = document.createElement('script');
                nodeScript.setAttribute('type', 'text/javascript');
                nodeScript.setAttribute('src', jsurl);
                nodeScript.setAttribute('id',sid);
                if (callback != null) {
                        nodeScript.onload = nodeScript.onreadystatechange = function(){
                                if (nodeScript.ready) {
                                        return false;
                                }
                                if (!nodeScript.readyState || nodeScript.readyState == "loaded" || nodeScript.readyState == 'complete') {
                                        nodeScript.ready = true;
                                        callback();
                                }
                        };
                }      
                nodeHead.appendChild(nodeScript);
        } else {
                if(callback != null){
                        callback();
                }      
        }      
}

因為使用者點擊後,載入js,但是如果js已經存在則不必載入了,直接調用回呼函數即可。所以在這裡我沒有移除script標籤。簡單測試了一下,貌似不會引發記憶體泄露。

利用 現在流行的jquery


jquery的 append 這個方法,然後就把代碼改成了

 代碼如下 複製代碼
$(document).append("<script type='text/javascript' src='"+_webInfPath+"/js/util.js'</script>");

OK

下面我來詳細介紹一下


首先HTML檔案部分代碼: 
    

 代碼如下 複製代碼

    <script type="text/javascript" src="./js/jquery-1.4.2.js"></script>
       <script type="text/javascript" src="./js/common.js"></script>

     <select id="ts1" jselect="ts1"></select><!-- 下拉框使用 -->

然後是common.js部分代碼:

 代碼如下 複製代碼
var _webInfPath = "" ;  //工程上下文web-inf路徑


//初始頁面

 代碼如下 複製代碼
$(document).ready(function(){
_webInfPath = getWebRootPath(); //擷取工程上下文路徑
$(document).append("<script type='text/javascript' src='"+_webInfPath+"/js/util.js'</script>");
JSelect(); //下拉框填值
}
);

//擷取項目跟路徑

 代碼如下 複製代碼
function getWebRootPath(){
var path = location.href ;
var pathArr = path.split("/");
return pathArr[0]+"//"+pathArr[2]+"/"+pathArr[3] ;
}

//下拉框填值

 代碼如下 複製代碼
function JSelect(){
$.each($("select"),function(){
var jqueryObj = $(this) ;
var jselect = $(this).attr("jselect") ;
$.ajax({
url: _webInfPath+"/servlet/ajaxServlet.do" ,   //(這裡的ajaxServlet其實是我寫的一個公用的servlet,效果和struts一樣,通過配置後,會自動執行action裡面的方法)
data:{"method":"getJselect","act":"glob","jselect":jselect },
type: "post" ,
async : "true" ,
dataType : "json",
success : function(result){
fillSelect(result,jqueryObj.attr("id"));
}
});
});
}

然後是util.js檔案的部分代碼:

 代碼如下 複製代碼

//-------------------------------------下拉框begin---------------------
/**
*填充下拉框供調用
*   jsonArr : 存放JselectVo對象的JOSN數組
*   selectId : selectID
*/
function fillSelect(jsonArr,selectId){
if(jsonArr==null || jsonArr.length==0){
return false ;
}
var content = "" ;
$.each(jsonArr,function(){
content += jselect_addOption(this);
});
$("#"+selectId).append(content);
}

//拼裝option
function jselect_addOption(_option){
var arr = new Array() ;
arr.push("<option value='" + _option.value+"'>");
arr.push(_option.name);
arr.push("</option>");
return arr.join("");
}

//-------------------------------------下拉框end---------------------


利用非同步載入方法ajax

原理:用XMLHTTP取得要指令碼的內容,再建立 Script 對象。
注意:a.js必須用UTF8編碼儲存,要不會出錯。因為伺服器與XML使用UTF8編碼傳送資料。這裡還有一種方法,在WEB Server上設定預設編碼,如果JS儲存為GB2312 就在伺服器設定預設的檔案編碼為GB2312,這樣就不會出錯了。
首頁面代碼:

 代碼如下 複製代碼
<script language="JavaScript">
function GetHttpRequest()
{
if ( window.XMLHttpRequest ) // Gecko
return new XMLHttpRequest() ;
else if ( window.ActiveXObject ) // IE
return new ActiveXObject("MsXml2.XmlHttp") ;
}
function AjaxPage(sId, url){
var oXmlHttp = GetHttpRequest() ;
oXmlHttp.OnReadyStateChange = function()
{
if ( oXmlHttp.readyState == 4 )
{
if ( oXmlHttp.status == 200 || oXmlHttp.status == 304 )
{
IncludeJS( sId, url, oXmlHttp.responseText );
}
else
{
alert( 'XML request error: ' + oXmlHttp.statusText + ' (' + oXmlHttp.status + ')' ) ;
}
}
}
oXmlHttp.open('GET', url, true);
oXmlHttp.send(null);
}
function IncludeJS(sId, fileUrl, source)
{
if ( ( source != null ) && ( !document.getElementByIdx_x( sId ) ) ){
var oHead = document.getElementsByTagName_r('HEAD').item(0);
var oScript = document.createElement_x( "script" );
oScript.language = "javascript";
oScript.type = "text/javascript";
oScript.id = sId;
oScript.defer = true;
oScript.text = source;
oHead.appendChild( oScript );
}
}
AjaxPage( "scrA", "b.js" );
alert( "首頁面動態載入JS指令碼。");
alert( "首頁面動態載入a.js並取其中的變數:" + str );
</script>

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.