2013-01-18 188 views
0

我打了一個問題,當我通過ajax的Javascript AJAX競爭條件

<script type="text/javascript" src="site.com/file.js"></script> 
<script type="text/javascript"> 
//use file.js object, get an exception because it doesn't exist 

存儲以下HTML到一個div我通過在本地(/myjs/file.js)收留了它固定它。但是,這感覺就像是一個黑客。我如何確保先加載它然後執行?看起來好像jquery.ready不是解決方案,因爲在我使用html之前,dom已經準備好了。如何正確地等待?

+2

不應該'site.com/file.js'是通過'http:// site.com/file.js'? – Charles

+2

不要直面。 – BruteCode

+0

@BruteCode:老兄,我們是程序員和軟件工程師。我們*關於詳細信息... :-) –

回答

4

你提到jQuery.ready,所以我猜你使用jQuery。如果是這樣,則不要將<script>標記放在div的內容中,而應使用jQuery.getScript,這會在加載腳本時爲您提供回調。

如果由於某種原因你不能這樣做,你可以輪詢,例如,在你的代碼想要使用的東西從file.js

function doSomethingWithFileJS() { 
    if (typeof anObjectProvidedByFileJS === "undefined") { 
     setTimeout(doSomethingWithFileJS, 50); 
     return; 
    } 

    // Here, you know file.js has been loaded 
} 
-1

將腳本移動到HTML的頭部。

+0

我不行。它被插入到一個不在腦袋裏的div裏 – BruteCode

+1

是的,你應該總是避免把腳本放在腦海中。 (我不是倒票的來源,BTW。) – Grinn

+0

@Grinn這不是寫在石頭上...... – bfavaretto

2

您應該能夠保證這樣做:

<script type="text/javascript" src="site.com/file.js" onload="myFunc()"></script> 
<script type="text/javascript"> 
function myFunc() { 
    //use file.js object here 
} 
</script> 

onload屬性指定一個函數來執行,一旦加載腳本。

+0

即使在IE上,'script'標籤上的'onload'屬性是否可靠?舊的IE不會觸發可以通過代碼掛接的'load'事件,所以我傾向於懷疑'onload'不能與它們一起工作(它們改爲「onreadystatechange」)。 –

+0

是的,這在較老的IE版本中會出現問題。 – techfoobar

1

不是最好的方法,但你可以做這樣的事情:

function checkIfLoaded(){ 
    if(typeof somefunctioninfilejs == 'function'){ 
    // load other script here 
    } 
    else { 
    // not loaded queue up a check 
    setTimeout(checkIfLoaded, 300); 
    } 
}