7

这个一定很简单。外部 javascript 文件包含:

function Hello() {
    alert('Hello');
}

它被getScript()ed 然后调用一个包含的函数

<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js" type="text/javascript"></script>
<script type="text/javascript">
    $.getScript('myscript.js');
    Hello();
</script>

我得到:

ReferenceError: Hello 未定义

但是如果脚本在 HTML<script>标记中被引用,它会按预期工作

<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js" type="text/javascript"></script>
<script src="myscript.js" type="text/javascript"></script>
<script type="text/javascript">
    Hello();
</script>

我错过了什么?如何引用在getScript()ed 脚本中创建的对象?我想用getScript()它来加载ready()事件脚本的原因。

4

2 回答 2

13

问题是该$.getScript()函数是异步的。之后立即调用该Hello()函数时,脚本尚未加载,因此该函数不可用。

加载带有常规<script>标签的脚本是同步进行的,因此如果您想复制该行为,您必须async在 Ajax 调用中禁用该选项。

getScriptalone does not support this, so you can do this using an $.ajaxcall with the appropriate options:

 $.ajax({
     url: 'myscript.js',
     dataType: 'script',
     async: false
});

这将阻止浏览器,直到加载脚本。

但是,更好的技术是使用回调,它$.getScript()确实支持:

$.getScript('myscript.js', function() {
    Hello();
});
于 2013-10-31T20:47:17.513 回答
5

您需要等待响应:

$.getScript('myscript.js', function(){
    Hello();
});
于 2013-10-31T20:48:42.240 回答