在jQuery 1.9中发生了什么变化导致$ .ajax调用因语法错误而失败

Gen*_*ick 33 jquery-1.9

我正在进行一个REST DELETE调用,返回204.在jQuery 1.8.3中,这有效,并命中request.done回调.但是如果我使用1.9,那么它会在textStatus中使用parsererror发送到request.fail,并在errorThrown中使用'SyntaxError:意外的输入结尾'.

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);
            });

        },
Run Code Online (Sandbox Code Playgroud)

任何人都知道1.9中会发生什么变化导致失败,以及为了解决这个问题需要改变什么?

所以,回答我自己的问题,看起来这实际上是问题所在:

来自jQuery升级指南

jQuery.ajax返回空字符串的JSON结果

在1.9之前,期望返回数据类型为JSON或JSONP的ajax调用会将空字符串的返回值视为成功案例,但会将null返回给成功处理程序或promise.从1.9开始,为JSON数据返回的空字符串被认为是格式错误的JSON(因为它是); 这将导致错误.使用错误处理程序来捕获此类情况.

所以,如果删除dataType

dataType: "json",
Run Code Online (Sandbox Code Playgroud)

它适用于jQuery 1.8.3和1.9.

Noe*_*ams 21

HTTP 204响应不是空字符串:它表示没有数据.这是删除和更新操作有效响应.

这看起来像是JQuery 1.9中引入错误.

删除dataType属性的原因是因为当它设置为"json"时,JQuery会尝试使用JSON.parse解析内容并因此失败.从机票:

对于除"json"之外的任何其他数据类型,这不会失败,因为回归是由于parseJSON与本机JSON.parse重新对齐(抛出null/undefined值的异常).

不要尝试通过statusCode属性为204添加处理程序的故障单中建议的变通方法,因为将触发该处理程序错误处理程序.可能的解决方案如下:

    $.ajax(url, {
    type: "DELETE",
    dataType: "json",
    error: function (error) {
        if (error.status === 204) {
            // Success stuff
        }
        else {
            // fail
        }
    }});
Run Code Online (Sandbox Code Playgroud)


Aar*_*ron 9

我遇到了一个非常类似的问题,你帮我找到了答案 - 谢谢你.我的解决方案略有不同,所以我想我会分享它.

如问题中所述,在JQuery网站上它说:

在1.9之前,期望返回数据类型为JSON或JSONP的ajax调用会将空字符串的返回值视为成功案例,但会将null返回给成功处理程序或promise.从1.9开始,为JSON数据返回的空字符串被认为是格式错误的JSON(因为它是); 这将导致错误.使用错误处理程序来捕获此类情况.

我将JSON数据传递给我的服务器上的方法,其中"void"作为返回类型,因为我不需要对success函数中的返回数据执行任何操作.在JQuery 1.9 +中的AJAX请求中传递JSON时,您不能再返回null.然而,这在以前版本的JQuery中是可能的.

要停止获取错误并获取成功函数,您必须在AJAX请求中返回有效的JSON.你传递的内容并不重要,只要它是有效的,因为(在我的情况下,无论如何)你没有使用返回的数据.