jquery ajax调用使用readystate 4,状态200,statustext ok返回错误

时间:2015-09-17 18:36:24

标签: javascript jquery ajax

这真让我难以置信。我从ajax收到错误回调。但是,如果我从错误消息中获取res.responseText(返回正确,顺便说一句)并使用它,它就做对了。就好像我收到了成功回调一样。

数据设置如下:

var dataToSend = {fieldname : textdata};

和ajax调用是这样的:

var ajaxOptions = {
    url: '/newpage',
    data: JSON.stringify(dataToSend),
    contentType: 'application/json; charset=utf-8',
    dataType: 'json',
    cache: false,
    processData: false,
    type: 'POST',
    success: function(res) {
        console.log("success!");
        $('#' + divname).html(res);
    },
    error: function(res) {
        console.log("There was an error: " + JSON.stringify(res));
        $('#' + divname).html(res.responseText);
    }
};

$.ajax(ajaxOptions);

错误消息为:出现错误:{"readyState":4,"responseText" [this part is perfectly fine], "status":200, "statusText":"OK"}

3 个答案:

答案 0 :(得分:14)

如果您的responseText不是正确的JSON,则会引发解析错误。 确保您的回复是有效的JSON 删除dataType: "json"

来自jQuery docs

  

dataType (默认:智能猜测(xml,json,script或html))

     

类型:字符串

     

您期望从服务器返回的数据类型。如果没有   如果指定,jQuery将尝试根据MIME类型推断它   响应(XML MIME类型将产生XML,在1.4 JSON中将产生   一个JavaScript对象,在1.4脚本中将执行脚本,和   其他任何东西都将作为字符串返回)。可用的类型(和   作为成功回调的第一个参数传递的结果是:

...

  

“json”:将响应评估为JSON并返回JavaScript   宾语。除非,否则跨域“json”请求将转换为“jsonp”   请求在其请求选项中包含jsonp:false。 JSON   数据以严格的方式解析;任何格式错误的JSON都被拒绝了   抛出一个解析错误。从jQuery 1.9开始,空响应也是如此   被拒绝;服务器应该返回null或{}的响应。   (有关正确的JSON格式的更多信息,请参阅json.org。)

答案 1 :(得分:2)

这恰好是您设置dataType以获取响应但响应不是您在数据类型中设置的响应。

因此,在您的情况下dataType: 'json',已设置,正如您在评论部分中提到的那样,您已在后端设置了string,因此您需要将数据类型更改为text

将您的数据类型更改为:

dataType: 'text',

答案 2 :(得分:0)

解决问题的一种方法是使用json编码的空数组:

echo json_encode([]);
return;

然后触发成功函数而不是错误。

或者只是将脚本dataType: 'json',更改为dataType: 'text',,告诉jquery接收文本回复。