【问题标题】:jQuery 1.5 AJAX call fails with "invalid label" for JSON requestsjQuery 1.5 AJAX 调用因 JSON 请求的“无效标签”而失败
【发布时间】:2011-02-03 13:09:40
【问题描述】:

我刚刚从 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 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(而且他对正确性非常挑剔)。

【问题讨论】:

  • 这可能是 json 本身的问题,我注意到自 1.4 以来 JQ 对 JSON 结构更加严格。我从 07 年开始的第一个 JSON 项目在我升级 JQ 时开始失败,我打开 JSON 输出并且对我的结构如此糟糕感到震惊。您可以发布 JSON 吗?
  • @picus:不,我针对多个验证器验证了我的 JSON,没关系。如果我实现 JSONP 回调,它会再次开始工作,所以格式没有问题。
  • @picus:我添加了一个不工作和工作 JSON 的示例。
  • @kappa 尝试在"esito": 之后添加一个空格。
  • @lonesomeday :我很幸运地发现了发生了什么,请参阅my answer。

标签: json jquery jquery-1.5


【解决方案1】:

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

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

如果其他人有这个问题,插件的仓库里有一个补丁:link

【讨论】:

  • 感谢分享链接。你拯救了我的一天!
  • 我的同事刚刚花了最后一个小时试图找出类似的问题。我们升级到 1.6 和验证插件不再冲突。谢谢。
【解决方案2】:

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

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

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

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

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

【讨论】:

    【解决方案3】:

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

    数据类型:“文本 json”

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

    【讨论】:

      【解决方案4】:

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

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

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

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

      【讨论】:

        【解决方案5】:

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

        【讨论】:

          【解决方案6】:

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

          【讨论】:

            【解决方案7】:

            更新到 jquery 1.7 解决了它

            【讨论】:

              【解决方案8】:

              解决办法如下:

              $.post("...", {},
                      function(data) {
              
                    // dont forget to add below lines         
              
                       },"json"); 
              

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2012-03-09
                • 1970-01-01
                • 2023-03-13
                相关资源
                最近更新 更多