2012-12-06 68 views
2

我在我們用來初始化所有應用程序的腳本中有這樣的代碼,它從我們所有應用程序需要的其他東西中加載了來自google CDN的jQuery。然後當我們加載特定的程序功能時,我們檢查以確保jquery已加載,以防CDN停機。我遇到的問題是它仍在加載第二個。如果我在行headTag.appendChild(jqTag);後添加一個簡單的alert("Test");,它可以很好地工作,但是如果我刪除警報,它會使用第二個。是什麼賦予了?當CDN關閉時,加載jQuery的備份副本

它們加載像這樣:

<script type="text/javascript" src="i-initializer.js"></script> 
<script type="text/javascript" src="i-program.js"></script> 

初始化腳本:

if(typeof jQuery=='undefined'){ 
    var headTag = document.getElementsByTagName("head")[0]; 
    var jqTag = document.createElement('script'); 
    jqTag.type = 'text/javascript'; 
    jqTag.src = 'http://ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js'; 
    headTag.appendChild(jqTag); 
} 

然後在另一個腳本中,我們有以下幾點:

if(typeof jQuery=='undefined'){ 
    var header = document.getElementsByTagName("head")[0]; 
    var qtag = document.createElement('script'); 
    qtag.type = 'text/javascript'; 
    qtag.src = 'http://feedback.oursite.com/scripts/jquery-1.8.3.min.js'; 
    qtag.onload = checkjQueryUI; 
    header.appendChild(qtag); 
} 
else 
{ 
    jQCode(); 
} 
jQCode() { 
... 
} 

回答

13

這是HTML5 Boilerplate使用的技術。首先,它加載Google CDN腳本,然後立即檢查全局jQuery對象是否存在 - 如果不存在,則CDN失敗並且加載本地副本。

<script src="//ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js"></script> 
<script>window.jQuery || document.write('<script src="js/vendor/jquery-1.8.3.min.js"><\/script>')</script> 
+0

很有意思。 HTML5樣板看起來是一個非常好的模型。謝謝你的提示。 – ios85

3

您的後備代碼異步加載jQuery。
這意味着其他腳本在jQuery加載之前運行。

添加一個alert()調用強制剩下的代碼等待(直到您單擊確定);到時候,jQuery將加載。

相反,您可以使用document.write()發出一個新的<script>標記以同步加載它。

或者,您可以將其餘代碼封裝在回調中,並在加載jQuery後調用回調。
如果你這樣做,你應該使用一個腳本加載器庫,它將爲你處理所有這些。