2012-12-11 106 views
1

可能重複:負載JS加載

我已經包括jQuery的是這樣的:

function loadScript(loc){ 
    var head = document.getElementsByTagName('head')[0]; 
    var file = document.createElement('script'); 
    file.src = loc; 
    file.type = "text/javascript"; 
    head.appendChild(file) 
} 

loadScript("js/jquery.js") 

現在,下一個腳本應加載相同的方式。但是如果在最後一行之後加載,我不能使用jQuery,因爲它可能無法完成加載。 那麼如何檢查,如果jQuery的加載完成了? 我可以做這樣的事情?:

while (typeof jQuery == 'undefined') 
    { 
    wait... 
    } 
+1

可能重複[如何檢查腳本元素加載事件跨瀏覽器沒有jQuery](http://stackoverflow.com/questions/12574549/how-to-check-the-script-element-load-event-accross -browser-without-jquery)或[動態腳本加載同步](http://stackoverflow.com/questions/774752/dynamic-script-loading-synchronization) – Bergi

+0

不,你不能做那樣的事情。無法在JavaScript中忙於等待,因爲它不會終止並凍結瀏覽器。另外,您永遠無法確定該腳本是否聲明瞭一個名爲「jQuery」的變量。 – Bergi

+0

檢查此相關的答案:** [加載排序動態添加的腳本標記](http://stackoverflow.com/a/38840724/2247494)** – jherax

回答

7

動態加載腳本的公認方法是創建腳本元素,然後附加到DOM(與您一樣),但也要分配回調函數來檢測何時加載腳本。

function loadScript(url, callback){ 
    var script = document.createElement("script") 
    script.type = "text/javascript"; 

    if (script.readyState){ 
     // handle IE 
     script.onreadystatechange = function(){ 
      if (script.readyState == "loaded" || script.readyState == "complete"){ 
       script.onreadystatechange = null; 
       callback(); 
      } 
     }; 
    } else { 
     // handle other browsers 
     script.onload = function(){ 
      callback(); 
     }; 
    } 

    script.src = url; 
    document.getElementsByTagName("head")[0].appendChild(script); 
} 

用法:

loadScript("https://ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js", function(){ 
    // jquery is loaded 
}); 
+0

你的建議爲我工作。這樣我就不必說「等到它被加載了」。 – Peter

+0

這是一段很棒的代碼片段,尤其是當您通過Adobe Target注入時。我有一個問題,在jQuery之前加載了滑動輪播。這樣的東西很好用例。 – Chad

0

JS是由應用程序使用單線程:如果您創建一個無限循環的整個頁面只會被卡住。

通常,在所有依賴庫和庫僅在收到$(document).ready事件後才使用JQuery中的DOM API之前包含JQuery。

0

很少有裝載機在那裏。您可以輕鬆使用它們。 ex。 -

  1. http://headjs.com/
  2. http://labjs.com/
  3. http://www.dustindiaz.com/scriptjs

檢查這一項http://labjs.com/documentation.php。這一個的編碼方法看起來與你的類似。你可以寫 -

<script> 
    $LAB 
    .script("framework.js").wait() 
    .script("plugin.framework.js") 
    .script("myplugin.framework.js").wait() 
    .script("init.js").wait(); 
</script> 

看到wait()?它告訴在執行其他腳本之前必須先加載「framework.js」。