2013-01-18 42 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); 
    } 
}