Javascript新加入動態載入js檔案功能

來源:互聯網
上載者:User
 

/**
*    SII.dyLoader 動態載入Javascript檔案
*     @param js{string} : js檔案的完整路徑
*     @param id{string} : 此Javascript檔案的id
*     @param callback{function} : 此Javascript檔案載入後的cb
*     @return 無傳回值
*/
       
SII.dyLoader=function(js,id,callback)
{
    var scriptId = document.getElementById(id);
    if (scriptId)
    {
        if (callback)
            callback();
    }
    else{
        var script = document.createElement("script");
        script.id = id;
        script.type = "text/javascript";
       
        script.onload = script.onreadystatechange = function()
        {
            if (script.readyState && script.readyState != 'loaded' && script.readyState != 'complete')
            {
            return;
            }
            script.onreadystatechange = script.onload = null;
            if (callback)
            callback();
        };
        script.src = js;
        var head = document.getElementsByTagName('head').item(0);
        head.appendChild (script);
    }
};

說明:
動態載入JS檔案的幾種思路

No.1直接document.write

<script language="javascript">
document.write("<script src='test.js'><\/script>");
</script>

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

<script src='' id="s1"></script>
<script language="javascript">
s1.src="test.js"
</script>

No.3動態建立script元素

<script>
var s2 = document.createElement("script");
s2.src="test.js"
document.body.insertAdjacentElement("BeforeBegin",s2);
</script>

基於prototype的scriptaculous(好像是這麼寫)
在載入的時候使用document.write,前面有一句注釋,大意是說動態操作dom節點不被支援safari2.0

基於此

/**
*    SII.staticLoader 動態載入Javascript檔案
*     @param js{string} : js檔案的完整路徑
*     @return 無傳回值
*/
SII.staticLoader = function(js){
    document.writeln("<scri"+"pt src='"+js+"' type='text/javascript'></sc"+"ript>");
};
   

我們有靜態loader方法。但是這個存在一個問題。
document.write 方法一旦執行會重寫html->body,導致頁面空白
正確的做法是在載入外部檔案後立即關閉<script>。

但是,這樣我們又產生另一問題,這樣我們載入js檔案的動作就不是動態了,也就是說我們不能這樣做了SII.staticLoader('a.js');
SII.loading....

只能這樣

SII.staticLoader('a.js');
</script>
<script>
SII.loading....
</script>

而上面那種方式又跟下面這種有啥區別呢。

<script type='text/javascript' src='a.js'></script>

所以,document.write方法被拋棄。

繼續鑽研dom節點的方式,
也就有了最後的結果。。不過不知道能不能支援safari2.0
實際上,能下載到的最低也是safari3.0了,目前都是用4.0

測試一下:
在首頁載入首頁沒有載入的js檔案,並且調用
        SII.dyLoader("http://static.zhongle.com/js/Guide.js","guide",function(){alert(Guide.AUTHOR);});
在FF,IE6,Safari3,Safari4中調用成功,彈出提示。

 
相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.