jQuery 1.5的AJAX调用在处理JSON请求时出现“无效标签”的错误

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(而且它对正确性要求很高)。


@picus:我已经添加了一个不起作用和一个起作用的JSON示例。 - Albireo
@kappa 请尝试在“esito”后面添加一个空格。 - lonesomeday
@lonesomeday:我幸运地发现了问题所在,请参见 我的答案 - Albireo
真的需要async: false吗? - ThiefMaster
@ThiefMaster:在进行选择时,我需要显示一些框,而AJAX并不总是被触发,它取决于某些条件,因此我选择了async: false而不是复制显示框的代码(这是一个内部网络应用程序,半秒钟的延迟并不重要)。 - Albireo
显示剩余3条评论
8个回答

28

好的,我找到出问题的原因了。

jQuery的验证插件与jQuery 1.5不兼容(参见这里这里),删除该插件可以得到正确的行为。

如果其他人也遇到这个问题,该插件仓库中有一个补丁:链接


我的同事刚刚花了一个小时来解决类似的问题。我们升级到1.6后,验证插件不再冲突了。谢谢。 - Scott Gottreu

5
我遇到了类似的问题,但这似乎与此 bug 有关:http://bugs.jquery.com/ticket/8398
这并不一定与 jQuery-validate 相关,我花了一些时间才发现。原来 jQuery 1.5 修改了后续 json 调用,使其变为 jsonp,从而导致了这个错误。
我通过遵循 bug 更改历史记录中建议的其中一种解决方法,在我的 ajax 调用之前放置了以下代码,以解决这个问题:
$.ajaxSetup({
   jsonp: null,
   jsonpCallback: null
});

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

2
这里有一个可能的解决方法,适用于使用验证器插件的人。
dataType: "text json"
非常好用。不要问我为什么。在Chrome上,您可以看到一个jQuery语法错误解析json返回值中的“:”。毫无疑问,返回值是有效的json。我没有尝试过,但我怀疑Tom上面的答案也会起作用。

1
尝试: 在jquery-1.5.js中快速搜索json,并在第6905行找到以下内容:
//检测、规范化选项并安装jsonp请求的回调
jQuery.ajaxPrefilter("json jsonp", function( s, originalSettings, dataIsString /* internal */ ) {

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


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

1

看起来这个问题在v1.6中已经解决了 - 在升级到版本1.5.1后遇到了同样的问题,但是在升级到1.6后,问题消失了。


0

这是解决方案:

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

      // dont forget to add below lines         

         },"json"); 

0

升级到jQuery 1.7可以解决此问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接