2010-01-08 41 views
6

He buscado las preguntas aquí, pero no entiendo muy bien cómo usar el manejo de errores en AJAX de jQuery (im noob, por lo que realmente no tiene sentido.)jQuery Manejo de errores AJAX

¿Alguien puede describir esto a un principiante? Actualmente estoy publicando información en un script PHP a través de AJAX, pero quiero permitir que jQuery reconozca si los datos devueltos del script son un error o un éxito.

Gracias! Dave

Respuesta

20

El retorno de error de la llamada AJAX está devolviendo el resultado de una carga de la página que no tuvo éxito. Puede ser que su página php devuelva una página válida, pero con resultados que no son los que usted desea. Esto se maneja con el retorno exitoso. Esperemos que el siguiente snippit de código ayude a ilustrar ...

$.ajax({ 
    type: "POST", 
    url: "login.php", 
    data: "action=login&user=" + user + "&pass=" + pass, 
    success: function(xhr){ 
     if ((xhr == "Invalid Login") 
       || (xhr == "Invalid charaters in username.") 
       || (xhr == "Missing username or password.") 
       || (xhr == "Unknown Error")) { 
      $("#loginMessageContent").html(xhr); 
     } 
     else { 
      simplemodalClose (dialog); 
     } 
    }, 
    error: function(xhr) { 
     alert ("Oopsie: " + xhr.statusText); 
    } 
}); 
+1

Bill, esto parece útil, ¿puedes darme una idea de lo que exactamente se haría eco de la secuencia de comandos PHP que permitiría el jquery para recoger (es decir, veo que sería "Inicio de sesión inválido", pero ¿Puedo hacerme eco de más información que eso?) –

+0

+1 ¡Gran respuesta, Bill! Creo que el nombre del parámetro 'xhr' en la devolución de llamada' success' es engañoso, ya que solo los datos devueltos no son el objeto 'xhr'. –

+0

Dave, puede devolver lo que quiera devolver, solo tenga en cuenta el tipo de datos que está utilizando. Para cosas simples como este ejemplo, el tipo de datos predeterminado es correcto, para datos más complejos, vea los otros tipos de datos disponibles. Por ejemplo, para usar datos JSON, haga que el código php envíe datos JSON. Mire los documentos jquery para $ ajax para ver cómo configurar dataType, también mire los documentos php para los métodos JSON. Doug, buen punto. – Bill

2

El manejo de errores jQuery AJAX se implementa para controlar si el HTTP Request tiene un error, no si el script devuelve "error" o "éxito". Si el servidor arroja un error (404 Not Found o 500 Server Error como ejemplo), activará las funciones de error de jQuery. Puede manejarse de varias maneras, pero una buena manera es mostrar un div que le indique al usuario que hubo un error.

HTML

<div id="error" style="display: none">There was an error processing your last request</div> 

jQuery

$(function(){ 
    $("#error").ajaxError(function(){ 
     var $error = $(this); 
     $error.slideDown(500, function(){ 
      window.setTimeout(function(){ 
       $error.slideUp(500); 
      }, 2000); 
     }); 
    }); 
}); 

Si se produce un error, ninguno de los métodos de "éxito" se disparará, y que div se deslizará hacia abajo, esperar 2 segundos, luego deslízate hacia arriba.

Prueba de su guión de errores

Como ya he dicho lo que usted describe suena como su script del servidor es el envío de "error" o "éxito" o algo similar de nuevo al cliente.

Si está usando un $.post, por ejemplo, el código de manejo de errores podría tener este aspecto:

$.post('/your/url', { save_me: true }, function(data){ 
    if(data == "error"){ 
     // handle error 
    } else { 
     // handle success 
    } 
} 
2

Este es solo un enfoque. Estoy construyendo una aplicación que devuelve todos sus datos en JSON. Si hay un error, el mensaje JSON se cambia para reflejar esto. Cada objeto devuelto tiene un "estado" de ya sea "éxito" o "error". Si es un error, entonces hay una parte "error_message" del JSON que describe el error.

Espero que ayude.

2

Aunque no es su problema, publicaré aquí porque está relacionado.

Con la reciente JQuery v1.4 release, las respuestas JSON ahora están validadas.Se rompió mi aplicación porque volví:

{success:true} 

y ahora se requiere que sea

{"success":true} // HAS to be double quotes, single won't do it 

Si no es correcto, se llama al gestor de errores. Solución fácil, pero tardó un poco en descubrirlo.

Cuestiones relacionadas