我刚刚从版本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(他对正确性非常挑剔)。
答案 0 :(得分:28)
好的,我发现了到底发生了什么。
jQuery的Validation plug-in与jQuery 1.5不兼容(请参阅one和two),删除插件会产生正确的行为。
如果其他人遇到此问题,插件的存储库中会有一个补丁: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");