2011-09-16 4 views
6

J'ai une fonction de publication qui n'est pas détectée en cas d'erreur.Jquery Ajax après succès/fonction d'erreur

Voici la valeur renvoyée par postride.php.

if ($group_id==0) { 
echo 'No group selected'; 
return false; 
exit; 
} 

Voici le code jquery:

$(document).ready(function(){ 
$('#postride').submit(function(event) { 
    event.preventDefault(); 
    dataString = $("#postride").serialize(); 
    $.ajax({ 
     type: "post", 
     url: "postride.php", 
     data:dataString, 
     error: function(returnval) { 
      $(".message").text(returnval + " failure"); 
      $(".message").fadeIn("slow"); 
      $(".message").delay(2000).fadeOut(1000); 
     }, 
     success: function (returnval) { 
      $(".message").text(returnval + " success"); 
      $(".message").fadeIn("slow"); 
      $(".message").delay(2000).fadeOut(1000);  
      //setTimeout(function() { top.location.href="view.php" }, 3000); 
     } 
    }) 
    return false; 
}); 

});

La fonction de publication renvoie false, mais la fonction d'erreur ne se déclenche pas, seule la fonction de réussite est activée. Il affichera "Aucun succès sélectionné par le groupe".

Merci pour toute aide!

Répondre

21

L'option d'erreur dans les méthodes ajax de jQuery est pour les erreurs causées par une mauvaise connexion, timeout, URL invalide, choses de cette nature. Ce n'est pas le genre d'erreur que vous pensez.

Ce que la plupart des gens est quelque chose comme ça ...

php

if ($group_id == 0) { 
echo json_encode(array(
    'status' => 'error', 
    'message'=> 'error message' 
)); 
} 
else 
{ 
echo json_encode(array(
    'status' => 'success', 
    'message'=> 'success message' 
)); 
} 

javascript

$(document).ready(function(){ 
$('#postride').submit(function(event) { 
    event.preventDefault(); 
    dataString = $("#postride").serialize(); 
    $.ajax({ 
     type: "post", 
     url: "postride.php", 
     dataType:"json", 
     data: dataString, 
     success: function (response) { 
      if(response.status === "success") { 
       // do something with response.message or whatever other data on success 
      } else if(response.status === "error") { 
       // do something with response.message or whatever other data on error 
      } 
     } 
    }) 
    return false; 
}); 
+0

Merci beaucoup pour la clarification ! – Matt

+0

De rien Matt –

+0

Nice, @AnthonyJack! Mais je pense que vous voulez dire 'dataType: 'json'' dans le code javascript ... – Simon

0

La méthode error de la fonction ajax de jQuery est appelée uniquement lorsque la page demandée renvoie un code d'état d'erreur. Votre exemple renverra probablement HTTP 200, c'est pourquoi success est appelé; jQuery n'interroge pas le contenu d'une réponse pour déterminer si elle a réussi ou non.

Vous devez définir 4xx status code lorsque $group_id vaut 0, en remplaçant votre appel echo par un appel à header.

2

wsanville est correct: "succès" ou "échec" fait référence au succès/échec de la requête ajax.

Plutôt que de modifier l'en-tête HTTP, cependant, je trouve utile de renvoyer des informations dans une réponse json. Ainsi, par exemple, j'aurais postride.php répondre comme ceci:

$error = false; 
if ($group_id==0) { 
    $error = 'No group selected'; 
} 
$response = array('error'=>$error); 
echo json_encode($response); 

Puis dans le rappel de « succès » de la JS, je ferais ceci:

success: function (returnval) { 
    if (returnval.error) { 
     $(".message").text(returnval + " failure") 
     .fadeIn("slow",function(){ 
      $(this).delay(2000).fadeOut(1000); 
     }); 
    } else { 
     //do whatever user should see for succcess 
    } 
+0

Anthony Jack a publié à peu près ce que j'allais dire en premier - si vous répondez à ma réponse, vous devriez lui attribuer une note, et accepter sa plutôt que la mienne. –

Questions connexes