为什么这里的responseText是未定义的?

10
$.ajax({
  url: 'http://jsonplaceholder.typicode.com/posts/1',
  method: 'GET',
}).done(function(data){
  console.log(data);
  console.log(data.responseText);
});

有人能帮我理解为什么console.log(data.responseText);返回undefined吗?

http://clarkben.com/ajaxtesting/

编辑:好的,看起来data不是jqXHR对象。如果将整个$.ajax语句分配给一个变量,则该变量是jqXHR对象,因此可以通过这种方式访问它。但我不确定传递给.done函数的数据为什么不是jqXHR对象。

var theRequest = $.ajax({
    url: 'http://jsonplaceholder.typicode.com/posts/1',
    method: 'GET',
}).done(function(data){
        console.log(data);
        console.log(theRequest.responseText);
  });

2
responseText是data的一个属性吗? - code
不过在我看来应该是这样的,因为data是从ajax请求返回的jqXHR对象。 - theclarkofben
使用控制台查看数据变量的所有属性...我看到了3个..我也喜欢你的答案“在我看来应该是”。 - code
1
不,这只是它的设计方式。当你使用.done(甚至是成功回调)时,第一个参数是解析后的数据。十有八九(甚至更多),解析后的数据才是你想要的,因此在大多数情况下,xhr作为第一个参数是没有意义的。 - Kevin B
1
即使您使用了dataType: "text",这个评论是否仍然正确?console.log(data);返回一个对象。它在某个时候被从您的问题中编辑掉了。我怀疑它实际上是一个对象,还是JSON,而您只是将其误解为对象。 - Kevin B
显示剩余9条评论
3个回答

4

默认情况下,jQUery会尝试猜测响应类型。如果响应头是application/json,则data将是一个JavaScript对象。如果响应类型类似于text/htmltext/plain,则data将是一个包含响应正文的字符串。

如果在字符串上调用data.responseText(或者是没有responseText属性的JavaScript对象),那么data.responseText显然为undefined

请参阅jQuery ajax文档:http://api.jquery.com/jquery.ajax/

jqXHR.done(function( data, textStatus, jqXHR ) {});

第一个参数是data。如果想要jqXHR,则是第三个参数。


好的,看起来数据不是一个jqXHR对象。如果将整个$.ajax分配给一个变量,那么该变量就是一个jqXHR,因此可以通过这种方式访问它。 - theclarkofben
你知道为什么传递给.done中的函数的数据不是预期的jqXHR对象吗? - theclarkofben

4

好的,最终我在jqXHR文档中找到了答案:

jqXHR.done(function( data, textStatus, jqXHR ) {});

.done()方法是success回调选项的替代构造函数,取代了已弃用的jqXHR.success()方法。有关实现细节,请参阅deferred.done()。

所以现在以下代码可以正常工作:

$.ajax({
    url: 'http://jsonplaceholder.typicode.com/posts/1',
    method: 'GET',
}).done(function(data, textStatus, jqXHR){
        console.log(data);
        console.log(jqXHR.responseText);
  });

终于到达目的地了!


0

数据是这样的:

{
  "userId": 1,
  "id": 1,
  "title": "sunt aut facere repellat provident occaecati excepturi optio reprehenderit",
  "body": "quia et suscipit\nsuscipit recusandae consequuntur expedita et cum\nreprehenderit molestiae ut ut quas totam\nnostrum rerum est autem sunt rem eveniet architecto"
}

这可能就是为什么数据是一个对象,而jQuery将其解释为对象。这就是为什么data.responseText返回undefined的原因;responseText不是该对象的属性。


哦,对了,我是指当你在屏幕上打印它并且出现[Object object]或类似的东西时...让我来修复一下。 - Dom Slee
那么数据不是 jqXHR 对象吗?它实际上是另一种类型的对象? - theclarkofben
好的,看起来数据不是一个jqXHR对象。如果将整个$.ajax分配给一个变量,那么该变量就是一个jqXHR,因此可以通过这种方式访问它。 - theclarkofben
1
可能是因为您使用请求访问的页面头部信息导致的。由于响应是一个Json对象,它可能会覆盖jqXHR对象。 - Dom Slee

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