捕获XMLHttpRequest跨域错误

时间:2011-02-16 15:46:49

标签: javascript jquery xmlhttprequest cross-domain cors

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

有解决方法吗?

3 个答案:

答案 0 :(得分: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请求失败的有用信息。你只知道它失败了。

答案 1 :(得分:5)

可能会出现错误状态:

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

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

答案 2 :(得分:2)

onerror 设置处理程序,您将能够捕获跨域异常。我不知道为什么 onerror 事件是针对异常而不是错误事件触发的,但我刚测试它并且它有效。

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