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

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

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

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

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

1 ответов


чтобы различать ошибки HTTP (404, 401, 403, 500, etc..) и запросить ошибки аборта (т. е. пользователь нажал Esc или перешел на другую страницу) , вы можете проверить XHR.свойство status, если запрос был прерван, член 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); 
} 

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