我正在做一个REST删除通话,它返回一个204的jQuery 1.8.3这个工程,并点击了request.done回调。 但是,如果使用1.9它跟在textStatus一个parsererror和“语法错误:输入意外结束”来request.fail在errorThrown。
remove = function (complete) {
var self = this;
var request = $.ajax({
context: self,
url: "/v1/item/" + itemId,
dataType: "json",
type: "DELETE"
});
request.done(removeCallback);
request.fail(function (xhr, textStatus, errorThrown) {
alert(errorThrown);
});
},
任何人都知道在1.9已经改变,将导致此失败,什么需要,以解决它的变化?
所以,回答我的问题,它看起来像这其实就是这个问题:
从jQuery的升级指南
jQuery.ajax返回一个空字符串的JSON结果
在此之前1.9,Ajax调用的预期JSON或JSONP的返回数据类型会考虑一个空字符串的返回值是一个成功的案例,但空返回成功处理程序或承诺。 如为1.9,空字符串返回JSON数据被认为是畸形的JSON(因为它是); 现在,这将抛出一个错误。 使用错误处理程序来捕获这样的情况。
所以,如果除去具体的数据类型
dataType: "json",
它的工作原理的jQuery 1.8.3和1.9。
一个HTTP 204响应是不是空字符串:它意味着不存在数据。 这是一个用于删除和更新操作有效的响应 。
这看起来像一个在JQuery的1.9引入了错误 。
究其原因除去类型属性修正,这是因为当它被设置为“JSON” JQuery的尝试解析使用JSON.parse和失败结果的内容。 从售票:
因为回归是由于与本地JSON.parse(抛出异常的空/未定义值)parseJSON的重新调整这不会失败,任何其他的dataType不是“JSON”。
不要试图在通过StatusCode属性增加了204处理器的票建议的解决方法,因为无论是处理程序和错误处理程序将被触发。 一种可能的解决方案如下:
$.ajax(url, {
type: "DELETE",
dataType: "json",
error: function (error) {
if (error.status === 204) {
// Success stuff
}
else {
// fail
}
}});
我有一个非常类似的问题,你帮我找到我的答案 - 所以谢谢你。 我的解决方案,但是略有不同,所以我想我会分享。
如问题所说,JQuery的网站上这样说的:
在此之前1.9,Ajax调用的预期JSON或JSONP的返回数据类型会考虑一个空字符串的返回值是一个成功的案例,但空返回成功处理程序或承诺。 如为1.9,空字符串返回JSON数据被认为是畸形的JSON(因为它是); 现在,这将抛出一个错误。 使用错误处理程序来捕获这样的情况。
我JSON数据传递给一个方法我用“空白”作为返回类型服务器上,因为我并不需要在成功函数返回的数据做任何事情。 在JQuery的1.9 +在AJAX请求通过JSON时,您不能再返回null。 这不过JQuery的以前的版本是可能的。
要停止收到错误并获得成功的功能,而不是火,你必须只需在您的AJAX请求返回有效JSON。 不要紧,你传递什么,只要它是有效的,因为(对我来说反正)你不使用返回的数据。
这个问题似乎是jQuery的对待204响应为“×”的空体(其中内容长度为0)。 这是一种解释,但不足之处是,“”得到像任何其他响应字符串处理。 所以,如果你调用jQuery.ajax()与数据类型:JSON选项,jQuery的尝试“”转换为一个对象,并抛出一个异常(“”是无效的JSON)。
jQuery的捕捉异常和恢复,但如果你喜欢完全避免异常(在你的开发环境),你可能会做一些像下面这样。 添加的“转换器”选项jQuery.ajax(),并用它来改变“”以空值(当我这样做的数据类型为JSON)响应。 就像是 :
var ajax_options =
{
/* ... other options here */
"converters" :
{
"text json" :
function( result )
{
if ( result === "" ) result = null;
return jQuery.parseJSON( result );
}
}
};
var dfd = jQuery.ajax( ajax_options );
文章来源: What changed in jQuery 1.9 to cause a $.ajax call to fail with syntax error