Перехват XMLHttpRequest междоменных ошибок - PullRequest
21 голосов
/ 16 февраля 2011

Есть ли способ отловить ошибку, вызванную Access-Control-Allow-Origin при отправке запроса? Я использую jQuery, и обработчик, установленный в .ajaxError(), никогда не вызывается, потому что запрос никогда не делается с самого начала.

Есть ли обходной путь?

Ответы [ 3 ]

18 голосов
/ 17 февраля 2011

Для запросов CORS должен запускаться обработчик onError XmlHttpRequest.Если у вас есть доступ к необработанному объекту 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 консоль браузера.log отобразит сообщение об ошибке.Однако это сообщение об ошибке недоступно для вашего кода JavaScript (я думаю, что это сделано из соображений безопасности, я задавал этот вопрос однажды: Можно ли перехватывать ошибки CORS? ).

  • xhr.status и xhr.statusText не установлены в обработчике onError, поэтому у вас нет никакой полезной информации о том, почему запрос CORS не был выполнен.Вы только знаете, что это не удалось.

5 голосов
/ 05 июня 2013

Статус ошибки можно получить так:

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

Источник: https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest/Using_XMLHttpRequest

2 голосов
/ 04 августа 2011

Установите обработчик для onerror , и вы сможете отлавливать междоменные исключения. Я не знаю, почему событие onerror вызывается для исключений, а не событие error , но я просто протестировал его, и оно сработало.

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