27

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

有什么解决方法吗?

4

3 回答 3

22

对于 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 代码无法使用该错误消息(我认为这是出于安全原因,我之前曾问过这个问题:是否可以捕获 CORS 错误?)。

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

于 2011-02-16T22:32:37.247 回答
8

可能会出现如下错误状态:

xhr.onerror = function(e) {
    alert("Error Status: " + e.target.status);
};

来源:https ://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest/Using_XMLHttpRequest

于 2013-06-05T03:30:09.840 回答
2

为onerror设置一个处理程序,您将能够捕获跨域异常。我不知道为什么会为异常而不是错误事件触发onerror事件,但我只是对其进行了测试并且它有效。

req = $.get('http://www.example.com');
req.onerror = function() { alert('An exception occurred.') };
于 2011-08-04T19:05:33.703 回答