【问题标题】:no callbacks are called in Firefox after ajax request with jquery with 302 redirect使用带有 302 重定向的 jquery 进行 ajax 请求后,Firefox 中没有调用回调
【发布时间】:2011-06-05 14:16:35
【问题描述】:

我有一个广泛使用 ajax 的 Rails 应用程序。使用 jQuery。例如,其中一个模型完全由 jQuery 管理:记录是由 ajaxly 创建、更新和删除的。除了更新记录之外,一切都很好。

我做了一些测试,我发现 Firefox 中的 jQuery(Mac 上的 3.6,Windows 上的 3.5 是我测试过的)在 302 重定向到相同的 URL 时检测服务器的响应有问题强>。我在 Firebug 中得到的是:

POST localhost:3000/resources/1 -> 302 找到

GET localhost:3000/resources/1 -> 200 OK

并且没有调用 jQuery 的 ajax 回调。既不成功,也不完整,也没有错误。 但是当我创建一条记录并且服务器重定向到另一个 URL 时,会调用“成功”回调:

POST localhost:3000/resources -> 302 Found

GET localhost:3000/resources/1 -> 200 OK

我自己调用 $.ajax 还是使用 jquery.form 的 ajaxForm() 都没关系。

有什么想法吗?

【问题讨论】:

  • AJAX 和重定向很难协同工作。浏览器不同,缓存可能是罪魁祸首。最简单的解决方案是消除该重定向,因为无论如何在 AJAX 中执行“POST-redirect-GET”并没有多大意义。
  • 就像 kijin 所说,尝试将 cache: false 附加到您的 AJAX 设置中。看看这是否有效。
  • @Anders,谢谢,但这没有用 :( 消除重定向似乎是迄今为止最好的解决方案
  • 如果你能做到,是的,这将是最好的解决方案。

标签: jquery ajax http-status-code-302


【解决方案1】:

301/302/303 重定向由浏览器的 XmlHttpRequest 处理程序完成,而不是由 jQuery。这并不能解释为什么您没有成功回调。但它可以解释为什么重定向在 ajax 端没有得到很好的测试。

一个问题是某些浏览器确实遵循 302,例如不遵循 301 或 303 重定向。在一个旧应用程序中,我们使用了 303 see-other 响应代码并在错误处理程序中处理它。这很好,因为我们可以执行新的 GET 请求而不是浏览器(这是错误的,应该这样做)。

但我们遇到了问题,具体取决于浏览器(我认为,不确定)。

当我看到你的 302 响应行为时,我认为你应该做我们所做的:在处理 ajax 请求后删除重定向。在响应中发送您想要的最终 HTML(这将是一个重定向服务器端),或者构建您自己的协议(基于 JSON?),您可以在其中以 json 键发送您的协议状态,也许还有一个新的 url 来检查对于另一个键的新响应,等等。

【讨论】:

  • 搜索 SO 会得到相同的结果:stackoverflow.com/questions/199099/…
  • 我知道 XmlHttpRequest,但是 jQuery 封装了它,所以它可能也是一个重要因素。我想我要删除重定向,或者自己调用一个propper GET。谢谢!
猜你喜欢
  • 2011-09-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-25
  • 2022-01-07
相关资源
最近更新 更多