2011-02-16 151 views
21

有没有什么办法可以在发出请求时捕获由Access-Control-Allow-Origin引起的错误?我正在使用jQuery,并且.ajaxError()中设置的处理程序永远不会被调用,因为请求永远不会开始。捕获XMLHttpRequest跨域错误

有什么解决方法吗?

+0

可能有用的信息:[使用XMLHttpRequest检测错误(http://ajaxpatterns.org/XMLHttpRequest_Call #Detecting_Errors) – drudge 2011-02-16 18:30:49

回答

18

对于CORS请求,应激发XmlHttpRequest的onError处理程序。如果您有访问原始的XMLHttpRequest对象,尝试设置一个事件处理程序,如:

function createCORSRequest(method, url){ 
    var xhr = new XMLHttpRequest(); 
    if ("withCredentials" in xhr){ 
    xhr.open(method, url, true); 
    } else if (typeof XDomainRequest != "undefined"){ 
    xhr = new XDomainRequest(); 
    xhr.open(method, url); 
    } else { 
    xhr = null; 
    } 
    return xhr; 
} 

var url = 'YOUR URL HERE'; 
var xhr = createCORSRequest('GET', url); 
xhr.onerror = function() { alert('error'); }; 
xhr.onload = function() { alert('success'); }; 
xhr.send(); 

注意的几件事情:

  • 在CORS请求,浏览器的console.log将显示一条错误消息。但是,该错误消息不适用于您的JavaScript代码(我认为这是出于安全原因,我之前问过这个问题:Is it possible to trap CORS errors?)。

  • xhr.status和xhr.statusText没有在onError处理程序中设置,因此您没有任何有用的信息说明CORS请求失败的原因。你只知道它失败了。

+2

啊,但是如何区分由CORS限制引起的错误与其他未指定的AJAX错误?在由于CORS而失败的XMLHttpRequest对象的`readyState`,`status`和`statusText`属性中似乎没有任何可辨别的东西。 – kpozin 2011-08-05 02:31:59

+0

我不认为这是可能的,看到这个问题:http://stackoverflow.com/questions/4844643/is-it-possible-to-trap-cors-errors – monsur 2011-08-10 21:48:07

+0

XDomainRequest已弃用 – mate64 2015-04-12 18:32:09

2

设置一个处理程序的onerror,你就能够赶上跨域例外。我不知道为什么事件是因异常而被触发的,而不是错误事件,但我只是测试了它并且它工作正常。

req = $.get('http://www.example.com'); 
req.onerror = function() { alert('An exception occurred.') };