jQuery ajax错误回调函数未触发

6

我正在使用ajax请求一个URL,结果返回HTTP头代码500。我期望这会触发错误函数:

    $.ajax({
  url: "http://xxx",
  dataType: "jsonp",
  crossDomain: true,
  success: function( data ) {
        alert('success');
  },
  error: function () {
        alert('error');
  }
});

这在Safari中可以工作,但在Chrome和Firefox中失败了。

我做错了什么?

这是最新的jQuery 1.4.X版本,由于某些原因我无法升级到更高版本。

响应发送HTTP代码500,内容类型为application/json,内容为:

jsonp1310063232212({"error":{"reason":"用户未找到"}})


我不确定这个版本的jQuery是否能够检测JSONP错误。尝试为你的请求设置一个超时时间。如果超过超时时间仍未收到结果,则回调可能会被调用。 - Martin Larente
谢谢,但没有更改。没有错误回调,没有成功回调。还添加了 ajaxError 方法,但也没有被调用。 - user429620
3个回答

6

根据JQuery文档[1]的说明,错误处理程序不适用于跨域脚本和JSONP请求。在早期版本的JQuery上它能够运作(但并不总是如此)。

我使用了一个简洁有效的插件解决这个问题,并包含了漂亮的错误处理程序:http://code.google.com/p/jquery-jsonp/

下载并将其添加到head中:

<script src="javascripts/jquery.jsonp-2.2.0.min.js" type="text/javascript"></script>

然后您可以使用类似于$.ajax()的函数$.jsonp():
$.jsonp({
    url: "http://xxx?callback=?",
    data: {
        var: 'test'
    },
    cache: false,
    success: function(data, textStatus) {
        // ...
    },
    error: function(xOptions, textStatus) {
        console.log('Error');
        // ...
    }
});

[1] http://api.jquery.com/jQuery.ajax/


我被困在使用较旧版本的jQuery(1.8.2)中,切换到jsonp函数对我有用。 - Ryan Ore

3

看起来直到jQuery 1.5才添加了crossDomain:

http://api.jquery.com/jQuery.ajax/

crossDomain(新增于1.5版本)

默认值为false,对于同域请求来说,跨域请求则为true。

如果您希望强制进行跨域请求(例如JSONP),即使在同一域中也是如此,请将crossDomain的值设置为true。这允许服务器端重定向到另一个域,例如。

正如Martin Larente在他的评论中建议的那样,这可能与不同的浏览器或jQuery如何检测/报告JSONP错误有关。


2

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