jQuery 1.5 AJAX调用失败,JSON请求的“无效标签”

时间:2011-02-03 13:09:40

标签: json jquery jquery-1.5

我刚刚从版本1.4升级到jQuery版本1.5,现在我的AJAX调用总是因“无效标签”错误而失败。

示例请求是:

jQuery.ajax({
    async: false
    , dataType: "json"
    , error: function (xhr, status, error) { ... }
    , success: function (data, status, xhr) { ... }
    , type: "post"
    , url: "ajax/request.asp"
});

在网上我发现当返回的JSON没有用jQuery的回调包装时会引发这个错误(例如jQuery1234({ "something": "abcd" })

问题是我正在返回JSON,而不是JSONP(我在AJAX请求中声明它),那么为什么我必须在返回的JSON中指定回调?

1.5 changelog对此没有任何说明......(或者是我无法阅读的人?)

更新

这是一个无效的JSON示例:

{
   "esito":"Ok",
   "centriCosto":[
      {
         "id":"1",
         "descrizione":"Colazione"
      },
      {
         "id":"2",
         "descrizione":"Pranzo"
      },
      {
         "id":"3",
         "descrizione":"Cena"
      }
   ]
}

这是一个回调包装的工作JSON:

jQuery1502710949228847014_1296739130498({
   "esito":"Ok",
   "centriCosto":[
      {
         "id":"1",
         "descrizione":"Colazione"
      },
      {
         "id":"2",
         "descrizione":"Pranzo"
      },
      {
         "id":"3",
         "descrizione":"Cena"
      }
   ]
})

顺便说一下,Firebug说它们都是有效的JSON(他对正确性非常挑剔)。

8 个答案:

答案 0 :(得分:28)

好的,我发现了到底发生了什么。

jQuery的Validation plug-in与jQuery 1.5不兼容(请参阅onetwo),删除插件会产生正确的行为。

如果其他人遇到此问题,插件的存储库中会有一个补丁:link

答案 1 :(得分:5)

我实际上遇到了类似的问题,但似乎与此错误相关:http://bugs.jquery.com/ticket/8398

它不一定与jQuery-validate相关,我花了一些时间来解决问题。事实证明,jQuery 1.5正在修改json到jsonp的后续ajax调用,这会导致此错误。

我通过遵循错误更改历史记录中建议的一个解决方法并在我的ajax调用之前将以下代码放在某处来修复它:

$.ajaxSetup({
   jsonp: null,
   jsonpCallback: null
});

也应解决其他ajax请求的任何问题。

答案 2 :(得分:2)

以下是使用验证程序插件的可能解决方法。

dataType:“text json”

像魅力一样工作。不要问我为什么。在chrome上,你可以看到在json返回时解析“:”的jquery语法错误。并且不要搞错,返回是有效的json。我没试过,但我怀疑汤姆上面的回答也会奏效。

答案 3 :(得分:1)

尝试: 在jquery-1.5.js中快速搜索了json,并在第6905行找到了这个:

//检测,规范化选项并为jsonp请求安装回调

jQuery.ajaxPrefilter("json jsonp", function( s, originalSettings, dataIsString /* internal */ ) {

从第一个参数中删除"json"将在spec时添加正确的行为。 dataType:"json"

答案 4 :(得分:1)

如果您的服务器端代码依赖于以“jsonp”开头的回调名称,则可能会出现问题。回调名称前缀在版本1.5中更改为“jQuery”。

答案 5 :(得分:1)

看起来现在在v1.6中修复了 - 在升级到ver 1.5.1&之后出现了同样的问题。升级到1.6之后,问题就消失了。

答案 6 :(得分:0)

更新到jquery 1.7解决了它

答案 7 :(得分:0)

以下是解决方案:

$.post("...", {},
        function(data) {

      // dont forget to add below lines         

         },"json");