- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在通过 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()
方法。
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
调用。
如果可以访问 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)
不建议这样做,但有可能。有一个流行的堆栈溢出问题如何绕过同源策略:
Ways to circumvent the same-origin policy
如果除了同源策略之外,远程脚本执行时间实在太长,本地脚本必须等待,可以使用 Ahmed Nuaman 的 iframe 解决方案:
关于jQuery跨域ajax : callback when executed,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18775450/
在我的上一个项目中,我使用了 rxJava,我意识到 observable.doOnError('onErrorCallback').subscribe(action) 和 observable.su
我是一名 C++ 初学者,我认为要真正学习指针和引用,我应该尝试创建一个回调函数,这是我在 JavaScript 中认为理所当然的事情。 但是,对于我的一生,我不知道为什么这些括号在 (*callba
我在库中有一个类,它具有在事件发生时执行的“onMessage”方法。 OnMessage 在执行时需要调用属于主应用程序中的类的“回调”方法。我假设这将通过构造函数完成,但我不知道它是如何实现的。
两者的 jQuery 文档基本上说明了相同的事情,所以我想知道两者之间是否有任何重大差异(如果有的话)。谢谢! 最佳答案 这方面的文档实际上非常糟糕,所以这是我在 studying the sourc
这个问题在这里已经有了答案: Using &&'s short-circuiting as an if statement? (6 个答案) Omitting the second expressi
我正在尝试在 golang 中定义一个回调: package main func main() { x, y := "old x ", "old y" callback
我有一个页面,其中包含从 Google 电子表格生成的许多图表。 典型代码如下所示: var url = "http://my.googlespreadsheet.com/tq?argumentshe
当我运行 linter 时,它显示: subscribe is deprecated: Use an observer instead of an error callback 代码来自 this a
对于异步套接字 // accept ... listener.BeginAccept( new AsyncCallback(AcceptCallback), listener); // listene
我希望能够根据在前面的函数中调用的是 callback(true) 还是 callback(false) 在回调函数中执行一些逻辑。 示例: foo.doFunction = function (pa
从 jQuery.scrollTo.js 库中看到这个 block (在 v1.4 的第 184 行)。 function animate( callback ){ $elem.animate
我正在尝试在我的应用中使用一些回调,它与 "callback(value)" 和 "callback.invoke(value)" 一起工作正确调用回调。 我想知道“回调(值)”是否只是一个缩短版本,
我决定从 keras 切换到 tf.keras(建议使用 here)。因此我安装了 tf.__version__=2.0.0和 tf.keras.__version__=2.2.4-tf .在我的旧版
我认为这实际上可能会回答我关于 Stack Overflow 的另一个问题如果我能确认这一点。 返回回调和只调用回调有什么区别? 我看到代码执行其中之一/或/两者,并试图思考为什么以及何时执行哪个。
我目前正在学习 Rust 并希望用它来开发 GUI基于 GTK+ 的应用程序。我的问题与注册回调有关在这些回调中响应 GTK 事件/信号和变异状态。我有一个有效但不优雅的解决方案,所以我想问一下是否有
我在回调函数中传递参数时遇到问题。我使用 redux-form,当我更改 SkinList 中的选择时,它会触发 onChange 回调 - activeSkinChange 方法 在activeSk
我有 8 个相互依赖的回调。我的想法是要有一个更具可读性的过程,但我不明白如何处理这个问题。 我的回调 hell 的一个例子是: return new Promise(function (resolv
因此,我的函数接受一个值和任意数量的回调作为参数(我应该使用扩散操作符吗?)该函数应该返回通过所有给定回调传递该值的最终结果。。我返回的“CB2(Res1)”不是一个函数。如何将第一个回调的结果传递给
在谈到 future 和回调时,documentation说是 The Vert.x core APIs are based on callbacks to notify of asynchronou
我开始觉得自己很蠢。我正在关注 Facebook-Connect 演示“The Run Around”。 当我导航到 http://www.[mysite].com/testing/register_
我是一名优秀的程序员,十分优秀!