【问题标题】:Access the json response from xhr in jquery在 jquery 中访问来自 xhr 的 json 响应
【发布时间】:2012-09-02 09:40:49
【问题描述】:

我有一个关于XMLHttpRequest 对象如何工作的问题。在https://developer.mozilla.org/en-US/docs/DOM/XMLHttpRequest 的属性下,我正在查看“响应”属性。描述说如果我的内容类型是 json,我应该得到一个 JavaScript 对象。但是,在我的代码中,xhr.response 属性是 undefined

具体来说,我有一个在 DOM 元素上设置的 .ajaxSuccess() 回调,它接收参数 (event, xhr, settings)xhr.responseText 是我的 json 的明文版本,但 xhr.response 未定义。有什么方法可以在不调用$.parseJson(xhr.responseText) 的情况下从 xhr 获取对象?

【问题讨论】:

  • 检查服务器是否返回“application/json”内容类型。这可能是 jquery 无法自动解析 json 的原因。
  • 嗯,是的,我的 xhr.responseType 也未定义。但在我的服务器代码(web.py 框架)中,我确实调用了 web.header("Content-Type", "application/json")。你能想到 xhr 没有得到它的任何原因吗?

标签: jquery ajax json xmlhttprequest


【解决方案1】:

我认为您将XMLHttpRequest 对象与$.ajaxSuccess() 使用的jQuery 的jqXHR 对象混淆了,应该 是前者的超集。

相反,您可以使用$.ajax()done 处理程序,它会为您解析JSON如果数据类型是json。例如:

$.ajax({
  url: url,
  dataType: 'json',
}).done(function (response) {
  // response is a JSON object, previously parsed by jQuery using $.parseJSON
});

还要注意,即使 $.ajaxSuccess() 的文档说你得到了一个普通的 XMLHttpRequest 对象,这不再是真的 jQuery 1.4.1 .相反,你 get 一个 jqXHR 对象。

【讨论】:

  • 是的,我明白这一点。但我没有使用本地回调,我使用的是 .ajaxSuccess() 全局回调,根据这个文档api.jquery.com/ajaxSuccess,你会得到一个普通的 XMLHttpRequest 对象
  • @afwu:但事实并非如此,至少如果您使用的是 jQuery > 1.4.1。检查这个小提琴,看看xhr instanceof XMLHttpRequest 的结果。 jsfiddle.net/9FD39
  • 谢谢 Joao,我的立场已得到纠正。所以我猜它的 jqXHR 是否有 jqXHR 的一个属性,它是我的 json 的 javascript 对象?您怎么知道版本 > 1.7 的情况有所不同?谢谢
  • @afwu:恐怕不会。您必须使用$.parseJSON 解析jqXHR.responseText,这是jQuery 在幕后所做的,将解析后的数据传递给$.ajax 回调,正如您从它的源代码中看到的那样:github.com/jquery/jquery/blob/master/src/ajax.js#L319。不幸的是,对于全局 $.ajaxSuccess 处理程序并没有这样做。这意味着充当 global 处理程序,可能与$.ajaxStart 结合使用以显示模式加载窗口,并在成功时将其隐藏。也许这就是 jQuery 在这种情况下不为您解析对象的原因。
猜你喜欢
  • 2019-04-29
  • 2023-03-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-26
  • 1970-01-01
相关资源
最近更新 更多