Подтвердить что ты не робот

Улавливание междоменных ошибок XMLHttpRequest

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

Есть ли способ обхода?

4b9b3361

Ответ 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 (я думаю, что это сделано по соображениям безопасности, я задал этот вопрос раньше: Возможно ли уловить ошибки CORS?).

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

Ответ 3

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

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