使用jQuery从xhr访问json响应

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

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


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

1

我认为你把XMLHttpRequest对象和jQuery的jqXHR对象混淆了,后者被$.ajaxSuccess()使用,它应该是前者的超集。

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

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

请注意,即使{{link1:$.ajaxSuccess()}}的文档说您会得到一个普通的XMLHttpRequest对象,但是自jQuery 1.4.1以来,这已经不再是真实的了。相反,您会得到一个jqXHR对象。

是的,我理解。但我没有使用本地回调函数,而是使用.ajaxSuccess()全局回调函数,根据这个文档http://api.jquery.com/ajaxSuccess/,你会得到一个原始的XMLHttpRequest对象。 - nidoran
@afwu:但如果你使用的是 jQuery > 1.4.1,情况就不一样了。请检查此 jsfiddle 链接,并查看“xhr instanceof XMLHttpRequest”的结果。http://jsfiddle.net/9FD39/ - João Silva
谢谢Joao,我认错了。所以我猜如果它的jqXHR是一个JavaScript对象,那么它的属性就是我的JSON的JavaScript对象?你怎么知道版本大于1.7时会有所不同呢?谢谢。 - nidoran
@afwu:恐怕不行。您必须使用$.parseJSON解析jqXHR.responseText,这就是jQuery在幕后执行的操作,以便将解析后的数据传递给$.ajax回调函数,正如您从源代码中看到的那样:https://github.com/jquery/jquery/blob/master/src/ajax.js#L319。不幸的是,全局的`$.ajaxSuccess`处理程序没有做同样的事情。这意味着它应该作为一个*全局*处理程序,可能与`$.ajaxStart`一起使用来显示模态加载窗口,并在成功时隐藏它。也许这就是为什么在这种情况下jQuery不会为您解析对象的原因。 - João Silva

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接