背景
我正在通过 jQuery 的调用从另一台服务器(跨域)加载和执行脚本。.ajax(...)
在执行来自其他服务器的代码之后,需要执行一些代码,因为否则有些对象是“未定义的”。
也许很重要:远程代码确实包含另一个getScript(...)
调用。我也必须等待这段代码被执行。我不能简单地从我的代码中加载第二个脚本,因为它的源是动态的(即取决于远程脚本的某些结果)。
没用:success
回调
显然,在远程代码加载之后、远程代码执行之前success
调用了一个回调。
# coffee script
executeLater = ->
# this bit of code needs to run after the remote code has been executed.
console.log("yehaa!")
$.getScript("http://example.com/script-from-other-server.js")
.success(executeLater) # this gets executed when the remote script is loaded,
# but before the remote script is executed.
不工作:async: false
显然,async
跨域请求会忽略该属性,如 jQuery 文档中所述:http: //api.jquery.com/jQuery.ajax/#jQuery-ajax-settings
此外,我想避免async: false
设置,因为据说它会阻止浏览器。
# coffee script
executeLater = ->
# this bit of code needs to run after the remote code has been executed.
console.log("yehaa!")
$.ajax(
dataType: 'script',
url: 'http://example.com/script-from-other-server.js',
async: false # does not work because the request is cross domain
)
.success(executeLater)
不工作:$.when(...).then(...)
显然,使用 jQuery 的when-then 机制,then
代码在 when 块执行之前执行。
# coffee script
executeLater = ->
# this bit of code needs to run after the remote code has been executed.
console.log("yehaa!")
$.when( $.ajax(
dataType: 'script',
url: 'http://example.com/script-from-other-server.js',
) ).then(executeLater)
编辑:确实有效,但无法使用:ajax
两个脚本
正如我在上面的“背景”部分中所说,我无法在生产中执行此操作,但是如果我将所有案例减少到一个并在我自己的脚本中加载通常由远程脚本执行的第二个脚本,一切正常美好的。
# coffee script
executeLater = ->
# this bit of code needs to run after the remote code has been executed.
console.log("yehaa!")
$.getScript("http://example.com/script-from-other-server.js")
.success( ->
$.ajax(
dataType: 'script',
cache: true,
# I do not know this url in production:
url: 'http://example.com/another-script-from-the-remote-server.js'
)
.success(executeLater)
)
要避免的事情
我讨厌使用像几个setTimout
调用这样的结构,直到定义了某个对象并执行该executeLater()
方法。
我需要什么:executed
回调
使用一种executed
回调而不是方法的success
回调将是完美的ajax
。但是,到目前为止,我还没有找到这个回调。
# coffee script
executeLater = ->
# this bit of code needs to run after the remote code has been executed.
console.log("yehaa!")
$.ajax(
dataType: 'script',
url: 'http://example.com/script-from-other-server.js',
executed: executeLater # <---- I NEED A CALLBACK LIKE THIS
)
有什么线索吗?
有谁知道我如何在远程代码执行后executeLater
执行该方法?谢谢!
编辑:同源政策
正如adeneo在评论部分指出的那样,JavaScript 的同源策略可能是问题所在。
我使用ajax
orgetScript
调用加载的脚本不允许从远程服务器加载和执行另一个脚本,以防止恶意脚本“回拨”。
以下实验支持这一点:
这不起作用:
<html><head>
<script language="javascript" src="http://code.jquery.com/jquery-1.10.2.js"></script>
<script language="javascript">
jQuery.getScript("http://example.com/script-from-other-server.js")
</script>
</head><body></body></html>
这有效:
根据this stackexchange answer,同源策略允许由 html<script>
标签加载的远程脚本通过ajax
.
<html><head>
<script language="javascript" src="http://code.jquery.com/jquery-1.10.2.js"></script>
<script language="javascript" src="http://example.com/script-from-other-server.js"></script>
</head><body></body></html>
问题仍然存在:有没有一种通过 ajax 调用来做到这一点的好方法,或者,我是否必须通过<script>
在 html 文档中插入标签来“证明”我“拥有这段代码”?