这真的让我很困惑。我从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);
错误信息是:There was an error: {"readyState":4,"responseText" [this part is perfectly fine], "status":200, "statusText":"OK"}
.
如果您的responseText不是正确的JSON,则抛出解析错误。要么确保您的响应是有效的JSON,要么删除dataType: "json"
。
From jQuery docs:
dataType(默认:Intelligent Guess (xml, json, script,或html))
类型:字符串
期望从服务器返回的数据类型。如果没有的MIME类型,jQuery将尝试推断它响应(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)
这恰好是当您设置dataType
以获得响应,但响应不是您在数据类型中设置的。
因此,在您的情况下设置了dataType: 'json',
,并且正如您在评论部分提到的那样,您在后端设置了string
,因此您需要将数据类型更改为text
。
将您的数据类型更改为:
dataType: 'text',
解决服务器端问题的一种方法是回显一个空数组,json编码:
echo json_encode([]);
return;
然后触发成功函数而不是错误。
或者只是将scriptside的dataType: 'json',
更改为dataType: 'text',
,告诉jquery接收文本响应