2010-11-25 17 views
24

Estoy tratando de acceder a un evento 404 que puedo ver como 404 con firebug pero la función de error no está funcionando, con mi código de abajo siempre obtengo el error: ¿éxito?jQuery Ajax 404 Handling

es decir.

$.ajax({ 
    type: 'get', 
    url: 'url: 'https://admin.instantservice.com/resources/smartbutton/5702/10945/available.gif?' + Math.floor(Math.random()*10001), 
    success: function(data, textStatus, XMLHttpRequest){ 
     console.log('Error: ' + textStatus); 
    }, 
    error:function (xhr, ajaxOptions, thrownError){ 
     alert(xhr.status); 
     alert(xhr.statusText); 
     alert(xhr.responseText); 
    } 
}); 

Otra vez Sé que el 1000% que obtengo 404 No encontrado en firebug, nunca desencadena el error.

¿Echo de menos algo?

+0

He probado que exactamente el mismo código y recibí las 3 alertas de error correctamente (primero fue '404') .. – cambraca

+0

¿Estás seguro de que realmente obtienes una respuesta con el código de estado 404 y no solo una respuesta regular con el código de estado 200 y una página que contiene texto que dice que es un 404? – Guffa

+0

@cambraca Lo mismo aquí. Probado con Firefox 3.6.12 y Firebug. – aefxx

Respuesta

13

Lo que también se puede hacer es utilizar la función $ .ajaxError, al igual que

$("#message").ajaxError(function(event, request, settings){ 
     $(this).show(); 
     $(this).append("<li>Error requesting page " + settings.url + "</li>"); 
    }); 
+3

No estoy seguro de por qué esto no tiene más votos positivos, funciona perfecto, vea: http://api.jquery.com/ajaxError/ – systematical

+0

Gracias @systemático - no estoy seguro, funciona muy bien para mí, lo tengo en la repetición para todos mis sitios. –

+7

La razón por la que esto no fue útil para mí fue porque todavía no se llama en el caso de JSONP. Desde http://api.jquery.com/ajaxError/: "Nota: Este controlador no se llama para secuencias de comandos entre dominios y solicitudes JSONP entre dominios". – iX3

1

tuve un resultado muy similar/problema. La conclusión es que no logré asegurarme de que mi URL no contenía ninguno de los mismos nombres de parámetros en la sección de datos de la función ajax.


La razón para mí, era que me genera la URL con el código php para obtener una URL

pines_url('com_referral', 'sendhttprequest') 

que da salida a una URL con un parámetro

option=com_referral 

y un parámetro

action=sendhttprequest 

Mi GRAN El problema fue que también estaba tratando de enviar una "acción" param en la sección de datos de una función AJAX.

data: {"action": "getpoints"} 

Así que la segunda acción se preponderantes que no existe "getpoints", pero la parte difícil es que Firebug, obviamente, no me diga la url con getpoints, sería dime la URL como sendhttprequest.

Espero que no sea confuso, pero también espero que esto ayude a alguien más con un problema similar.

1

Agregar un valor de tiempo de espera hará que se ejecute la devolución de llamada de error si no hay respuesta en el tiempo especificado. Con una devolución de llamada de 5000, si la solicitud de jsonp no responde en 5 segundos (es decir, 404), se ejecutará la devolución de llamada de error.

$.ajax({ 
    type: 'get', 
    timeout: 5000, 
    url: 'url: 'https://admin.instantservice.com/resources/smartbutton/5702/10945/available.gif?' + Math.floor(Math.random()*10001), 
    success: function(data, textStatus, XMLHttpRequest){ 
     console.log('Error: ' + textStatus); 
    }, 
    error:function (xhr, ajaxOptions, thrownError){ 
     alert(xhr.status); 
     alert(xhr.statusText); 
     alert(xhr.responseText); 
    } 
}); 
+0

Esto supone que un 404 tarda al menos 5 segundos en ser atendido? – ficuscr

+0

Sí, 5 segundos es un valor predeterminado bastante agresivo. Si te estás conectando a un servidor lento, puedes subir hasta 30 segundos, pero en detrimento de la experiencia del usuario. – uberweb

+0

No funciona. El error nunca se llama. – AndroidDev

0

No sé exactamente por qué, pero si se utiliza el método de encadenamiento .fail, el error se captura correctamente, incluso si se trata de un sitio diferente:

$.ajax({ 
    type: 'get', 
    url: 'http://example.com', 
    success: function(data, textStatus, XMLHttpRequest){ 
     console.log('Error: ' + textStatus); 
     } 
    }).fail(function (xhr, ajaxOptions, thrownError) { 
     alert(xhr.status); 
     alert(xhr.statusText); 
     alert(xhr.responseText); 
    });