Solución:
En la devolución de llamada de error o $ .ajax tiene tres argumentos de entrada:
function (XMLHttpRequest, textStatus, errorThrown) {
this; // options for this ajax request
}
Puede consultar directamente el xhr.status
para obtener el código de respuesta HTTP, por ejemplo:
$.ajax({
url: "test.html",
cache: false,
success: function(html){
$("#results").append(html);
},
error: function (xhr, textStatus) {
if (xhr.status == 500) {
alert('Server error: '+ textStatus);
}
}
});
Editar:
Para saber la diferencia entre una conexión rota por el navegador y el caso en el que el servidor no funciona (comentario de jasonmerino):
Al descargar, xhr.readyState debería ser 0, mientras que para un servidor que no responde, xhr.readyState debería ser 4.
Este es un problema difícil de manejar correctamente en todas las situaciones. Desafortunadamente, en muchos navegadores populares el xhr.status
es el mismo (0
) si la llamada AJAX se cancela por navegación o porque un servidor no responde o no responde. Entonces esa técnica rara vez funciona.
Aquí hay un conjunto de trucos muy “prácticos” que he acumulado y que funcionan bastante bien en la mayoría de las circunstancias, pero que aún no son a prueba de balas. La idea es intentar capturar los eventos de navegación y establecer una bandera que esté marcada en el controlador de errores AJAX. Como esto:
var global_is_navigating = false;
$(window).on('beforeunload',function() {
// Note: this event doesn't fire in mobile safari
global_is_navigating = true;
});
$("a").on('click',function() {
// Giant hack that can be helpful with mobile safari
if( $(this).attr('href') ) {
global_is_navigating = true;
}
});
$(document).ajaxError(function(evt, xhr, settings) {
// default AJAX error handler for page
if( global_is_navigating ) {
// AJAX call cancelled by navigation. Not a real error
return;
}
// process actual AJAX error here.
});
(¡Agregaría esto como un comentario a la respuesta principal, pero aún no he acumulado suficientes puntos para hacerlo!)
También veo esto en FF4 y Chrome (9.0.597.107). Probablemente en otro lugar, ¡pero eso es lo suficientemente malo como para querer arreglarlo!
Una de las cosas extrañas de esta situación es que devolvió XMLHttpRequest.status === 0
Lo que parece una forma confiable de detectar esta situación y, en mi caso particular, abortar el manejo de errores personalizado que se muestra al usuario:
error: function (XMLHttpRequest, textStatus, errorThrown) {
if (XMLHttpRequest.status === 0) return;
// error handling here
}
También vale la pena mencionar que suponiendo que pueda haber un problema en el análisis JSON de lo que sea que el navegador esté devolviendo a la llamada $ .ajax (), también intenté cambiar el JSON.stringify nativo por la versión de Douglas Crockford (https: //github.com/douglascrockford/JSON-js) pero eso no hizo ninguna diferencia.