【问题标题】:What exactly triggers jQuery ajax success?究竟是什么触发了 jQuery ajax 成功?
【发布时间】:2013-01-01 22:01:29
【问题描述】:

我正在 Perl Web 框架 Dancer 中构建一些 ajax,因为我无法从看似成功的请求中触发 jQuery 的 ajax 成功处理程序,因此我不确定它是否使用正确的 http 标头进行响应。使用下面的 ajax sn-p 我在浏览器控制台中得到以下输出。完整的回调被成功调用并给出看起来像成功的输出。 Status:200 StatusText:"OK" 但是,成功处理程序永远不会被调用。

$.ajax({type: "GET", url: "/learn/faq",
 success: function(data){console.log('omg got it');},
 complete: function(data){console.log("complete", data);}
}).success(function(data){console.log('defered');});


Object
XHR finished loading: "https://www.localhost:4443/learn/faq". assets-d36e1bb9fd59ba3dbd0f8a0cbb37ed8e.js:1
complete 
Object {readyState: 4, responseText: "↵↵<!DOCTYPE html>↵<html xmlns="http://www.w3.org/1…ead/conversion.js"></script>↵↵↵↵</body>↵</html>↵↵", status: 200, statusText: "OK"

我应该看到omg got itdefered 消息,但我没有。看着这个,我觉得 jQuery 成功处理程序不仅仅是状态和 Dancer http 实现没有正确响应。

此外,我已经向 sn-p 添加了一个 error 处理程序,并且错误处理程序被触发,看起来像是一个成功的请求。

$.ajax({type: "GET", url: "/learn/faq",
 success: function(data){console.log('omg got it');},
 complete: function(data){console.log("complete", data);},
error: function(data){console.log("error!", data);}
}).success(function(data){console.log('defered');});
Object
XHR finished loading: "https://www.localhost:4443/learn/faq". assets-8cd028b93e0db9dd9455125dc98d5ae1.js:1
error! 
Object {readyState: 4, responseText: "↵↵↵↵↵↵↵↵↵↵↵↵↵↵↵↵<!DOCTYPE html>↵<html xmlns="http:…></script>↵↵↵↵</body>↵</html>↵↵↵↵</body>↵</html>↵", status: 200, statusText: "OK"}
complete 
Object {readyState: 4, responseText: "↵↵↵↵↵↵↵↵↵↵↵↵↵↵↵↵<!DOCTYPE html>↵<html xmlns="http:…></script>↵↵↵↵</body>↵</html>↵↵↵↵</body>↵</html>↵", status: 200, statusText: "OK"}

这是来自jQuery getAllResponseHeaders()的响应标头

complete Date: Tue, 01 Jan 2013 22:43:52 GMT
Content-Encoding: gzip
X-Powered-By: Perl Dancer 1.3095.1
Transfer-Encoding: chunked
Connection: keep-alive
Server: nginx/1.2.4
Strict-Transport-Security: max-age=2592000
Content-Type: text/xml; charset=utf-8

【问题讨论】:

  • 您是说您没有看到omg got it 或没有看到defered(或两者兼而有之?)。因为when I do it 我得到omg got it,然后是defered,然后是complete
  • 没有看到这些成功消息。如果我在许多其他在线网站上运行相同的 jQuery sn-p,它们就会被触发。
  • @kevzettler:所以问题是:有什么特别的?您是否真的在问题中复制并粘贴了代码?你不是真的在做跨域的东西,等等?页面上其他地方没有脚本错误掩盖了结果?一定有什么,基本答案是jQuery的success是由200响应触发的,它能够根据Content-Type标头(或dataType,如果你提供一个,但你不是't)。
  • 你引用的内容没有加起来。你引用了$.ajax(... url: "/learn/faq",但随后表明你得到的是XHR finished loading: "https://www.crowdtilt.com/"。那是不匹配。请引用您实际在做什么以及您实际要返回什么。
  • @T.J.Crowder 这是我正在测试的确切复制粘贴代码。我在项目的其他领域注意到了这个问题,并将其与此隔离。我已经在我们的生产应用程序上重现了这个 sn-p 的问题,该应用程序位于真正的 SSL 证书和所有相同的源域上。正如您已经展示的那样,如果我使用 sn-p 其他站点,它会正常运行。我对这个问题的最后一次更新表明,它触发了error 回调,这可能是一个更好的调查点。

标签: jquery dancer


【解决方案1】:

success 处理程序将被触发

  • 响应的 HTTP 状态代码为 200(你的有)
  • jQuery 能够根据响应中的Content-Type 标头(或dataType 选项,如果您提供它,它将覆盖Content-Type 标头)反序列化响应

因此,例如,如果您的响应具有 application/jsonapplication/xmlContent-Type 标头,则您引用的响应不会触发 success 处理程序,因为它无法成功反序列化为 JSON 或XML。


您的最新编辑(在撰写本文时)揭示了问题:

这里是来自 jQuery getAllResponseHeaders() 的响应头

...

Content-Type: text/xml; charset=utf-8

我怀疑你的响应不是有效的 XML,所以 jQuery 不能将它反序列化为 XML,所以它失败了。

【讨论】:

  • 那么什么对Content-Type有效?
  • @kevzettler: Content-Type 定义了响应的 MIME 类型。如果响应是 HTML,它应该是text/html。如果响应是XML,应该是application/xml
  • @kevzettler:您的最新编辑揭示了问题,请参阅更新后的答案。
  • 确实如此。在这种情况下,响应应该是 text/html 响应。
  • @kevzettler:很高兴有帮助!
【解决方案2】:

为了扩展 TJ 的答案,以下是jQuery 3.5.1 的摘录(同样的检查也在 1.7.1 版本中,因此可以安全地假设中间的版本也是如此)。

   // Determine if successful
   isSuccess = status >= 200 && status < 300 || status === 304;

根据它,成功的状态码不仅仅是200,而是介于 200 和 299 和 304 之间的任何值。

【讨论】:

    猜你喜欢
    • 2018-10-10
    • 2020-03-07
    • 1970-01-01
    • 1970-01-01
    • 2021-05-07
    • 2012-07-23
    • 2016-09-10
    • 2023-03-15
    • 2012-10-17
    相关资源
    最近更新 更多