gpt4 book ai didi

jQuery跨域ajax : callback when executed

转载 作者:行者123 更新时间:2023-12-03 22:41:50 24 4
gpt4 key购买 nike

背景

我正在通过 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 mechanism ,显然,then代码when block 执行之前执行。

# 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()方法。

我需要什么:A 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 的 same-origin policy可能是问题所在。

我用 ajax 加载的脚本或getScript call 不允许从远程服务器加载并执行另一个脚本,以防止恶意脚本“call home”。

以下实验支持了这一点:

这不起作用:

<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 文档中?

最佳答案

背景

adeneo 建议考虑 JavaScript 同源策略(请参阅对该问题的评论)确实解决了我的问题。

问题假设在请求的脚本完全执行之前调用 success 回调,真正的问题是,请求的脚本确实请求另一个脚本,如问题中所述:

Maybe important: The remote code does contain another getScript(...) call. And I have to wait for this code to be executed as well. I cannot simply load this second script from my code, because its source is dynamic (i.e. depends on some results of the remote script).

当动态加载请求的脚本时,JavaScript 的同源策略会阻止第二个 getScript 调用。

解决方案1:在html代码中包含脚本

如果可以访问 html 文件,则可以添加一个脚本标记,其中远程脚本为 src。因此,“证明”确实想要加载此远程脚本,并且 javascript 将执行远程 getScript 调用。

<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>

为了执行 executeLater 代码,只需使用 ready 回调即可:

# coffee script

executeLater = ->
# this bit of code needs to run after the remote code has been executed.
console.log("yehaa!")

$(document).ready(executeLater)

解决方案 2:规避部分来源政策

不建议这样做,但有可能。有一个流行的堆栈溢出问题如何绕过同源策略:

Ways to circumvent the same-origin policy

解决方案3:真正等待脚本执行

如果除了同源策略之外,远程脚本执行时间实在太长,本地脚本必须等待,可以使用 Ahmed Nuaman 的 iframe 解决方案:

https://stackoverflow.com/a/18793000/2066546

关于jQuery跨域ajax : callback when executed,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18775450/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com