10

我刚刚从 jQuery 的 1.4 版升级到 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的变更日志对此一无所知...(或者是我看不懂?)

更新:

这是一个不工作的 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(而且他对正确性非常挑剔)。

4

8 回答 8

28

好吧,我知道到底发生了什么。

jQuery 的Validation 插件与 jQuery 1.5 不兼容(参见),删除插件会产生正确的行为。

如果其他人有这个问题,插件的存储库中有一个补丁:链接

于 2011-02-03T13:39:26.913 回答
5

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

它不一定与 jQuery-validate 相关,我花了一段时间才弄清楚。事实证明,jQuery 1.5 正在将后续的 ajax 调用修改为 jsonp,这导致了这个错误。

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

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

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

于 2011-04-14T14:13:27.520 回答
2

对于那些使用验证器插件的人来说,这是一个可能的解决方法。

数据类型:“文本 json”

奇迹般有效。不要问我为什么。在 chrome 上,您可以在 json 返回上看到解析“:”的 jquery 语法错误。毫无疑问,返回的是有效的 json。我没有尝试过,但我怀疑上面汤姆的回答也会起作用。

于 2011-06-22T19:40:11.887 回答
1

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

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

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

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

于 2011-02-19T11:33:45.297 回答
1

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

于 2011-04-15T21:00:06.780 回答
1

看起来这已在 v1.6 中得到修复 - 升级到 1.5.1 版后出现同样的问题,升级到 1.6 版后问题消失了。

于 2011-05-11T03:52:33.653 回答
0

更新到 jquery 1.7 解决了它

于 2011-12-05T11:27:15.483 回答
0

这是解决方案:

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

      // dont forget to add below lines         

         },"json"); 
于 2012-04-23T12:43:01.360 回答