捕获 XMLHttpRequest 跨域错误

Posted

技术标签:

【中文标题】捕获 XMLHttpRequest 跨域错误【英文标题】:Catching XMLHttpRequest cross-domain errors 【发布时间】:2011-06-28 11:04:54 【问题描述】:

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

有什么解决办法吗?

【问题讨论】:

可能有用的信息:Detecting Errors with XMLHttpRequest 【参考方案1】:

对于 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 请求失败的原因,您并没有任何有用的信息。你只知道它失败了。

【讨论】:

啊,但是您如何区分由 CORS 限制引起的错误和其他未指定的 AJAX 错误?由于 CORS 而失败的 XMLHttpRequest 对象的 readyStatestatusstatusText 属性似乎没有任何可辨别的地方。 我不认为这是可能的,看到这个问题:***.com/questions/4844643/… XDomainRequest 已弃用【参考方案2】:

可能会出现这样的错误状态:

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

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

【讨论】:

-1 我在您的参考中没有看到类似的内容,实际上onError 中应该没有状态代码。 onError 仅在网络故障时触发,并且如果您有一个状态码,则表示响应已成功接收。【参考方案3】:

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

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

【讨论】:

js就是这样工作的,req.onerror = function () ..相当于req.addEventListener('error', function () ..)

以上是关于捕获 XMLHttpRequest 跨域错误的主要内容,如果未能解决你的问题,请参考以下文章

为啥一些跨域 XMLHttpRequest 请求不返回 CORS 错误

如何捕获 jQuery AJAX 错误?

跨域调用错误:XMLHttpRequest:网络错误 0x80070005,访问被拒绝

跨域出现:XMLHttpRequest cannot load错误

如何使用 XMLHttpRequest 捕获无效 URL 引发的错误

chrome 扩展中的跨域 XMLHttpRequest