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

Обнаружение ошибки XHR действительно происходит из-за остановки браузера или перехода на новую страницу

Пока моя страница загружает контент через XHR, если пользователь нажимает кнопку "Стоп" или нажимает, чтобы перейти на другую страницу, вызывается функция XHR error(). Обычно это не будет большой проблемой, кроме шока пользователя, если вы увидите много (красных) сообщений об ошибках на странице.

Сообщения действительны - действительно была ошибка получения содержимого, но из-за взаимодействия с пользователем, а не из-за сбоя системы.

Есть ли способ различать ошибку (404 | 500 | timeout) и ошибку, вызванную тем, что пользователь нажал кнопку остановки браузера?

EDIT: я использую Dojo (отсюда ссылка на функцию ошибки), но я считаю, что это будет ситуация, которая является общей для любой реализации XHR. Я буду смотреть в readyState объекта xhr, когда вызывается ошибка()

4b9b3361

Ответ 1

Чтобы различать ошибки HTTP (404, 401, 403, 500 и т.д.)) и запрашивать ошибки абортов (т.е. пользователь нажал Esc или перешел на другую страницу), вы можете проверить XHR.status, если запрос был прерван, член статуса будет равен нулю:

document.getElementById('element').onclick = function () { 
  postRequest ('test/', null, function (response) { // success callback
    alert('Response: ' + response); 
  }, function (xhr, status) { // error callback
    switch(status) { 
      case 404: 
        alert('File not found'); 
        break; 
      case 500: 
        alert('Server error'); 
        break; 
      case 0: 
        alert('Request aborted'); 
        break; 
      default: 
        alert('Unknown error ' + status); 
    } 
  }); 
};

Простая функция postRequest:

function postRequest (url, params, success, error) {  
  var xhr = XMLHttpRequest ? new XMLHttpRequest() : 
                             new ActiveXObject("Microsoft.XMLHTTP"); 
  xhr.open("POST", url, true); 
  xhr.onreadystatechange = function(){ 
    if ( xhr.readyState == 4 ) { 
      if ( xhr.status == 200 ) { 
    success(xhr.responseText); 
      } else { 
    error(xhr, xhr.status); 
      } 
    } 
  }; 
  xhr.onerror = function () { 
    error(xhr, xhr.status); 
  }; 
  xhr.send(params); 
} 

Запустите приведенный выше фрагмент здесь.