222 votes

L'événement de réussite Ajax ne fonctionne pas

J'ai un formulaire d'inscription et j'utilise jQuery Ajax pour le soumettre.

Voici le code jQuery Ajax :

$(document).ready(function() {
    $("form#regist").submit(function() {
        var str = $("#regist").serialize();
        $.ajax({
            type: 'POST',
            url: 'submit1.php',
            data: $("#regist").serialize(),
            dataType: 'json',
            success: function() {
                $("#loading").append("<h2>you are here</h2>");
            }        
        });
        return false;        
    });
});

J'ai une validation à submit1.php pour l'email et le nom d'utilisateur. Lorsque je soumets le formulaire avec des données valides, il entre dans la base de données et si j'entre des données répétées ou un email invalide, il n'entre pas dans la base de données. Donc mon submit1.php fonctionne bien.

Mon principal problème est que l'événement de la fonction de réussite à Ajax ne fonctionne pas.

**

La suppression de dataType:json a fonctionné et ma événement de la fonction de succès a été appelé. Cependant, j'ai maintenant un autre problème. Dans mon fichier submit1.php, je vérifie la répétition de l'adresse e-mail et le nom d'utilisateur dans la base de données. Si l'email ou le nom d'utilisateur est répété alors une erreur doit être générée pour le l'utilisateur sans rafraîchissement de la page. J'ai mis un die() dans mon serveur script. Comment puis-je renvoyer cette réponse à l'événement de succès dans ajax ? merci

**

4 votes

Êtes-vous sûr que le rappel de réussite est invoqué ?

1 votes

Vous devez poser une nouvelle question pour votre deuxième problème.

430voto

Tatu Ulmanen Points 52098

Le résultat n'est probablement pas au format JSON, donc lorsque jQuery essaie de l'analyser comme tel, il échoue. Vous pouvez attraper l'erreur avec error: fonction de rappel.

De toute façon, vous ne semblez pas avoir besoin de JSON dans cette fonction, donc vous pouvez également supprimer la balise dataType: 'json' rang.

23 votes

J'ai changé le dataType en texte et j'ai réussi à le faire fonctionner. comme ceci dataType:'text'

0 votes

+1 même mon, mais sur un code qui n'était pas le mien, j'ai résolu en retournant des données json du serveur

4 votes

Cela peut également se produire si un dataType: n'est pas spécifié, mais le url: se termine par .json .

23voto

js newbee Points 71

Bien que le problème soit déjà résolu, j'ajoute ceci dans l'espoir que cela puisse aider d'autres personnes.

J'ai fait l'erreur d'essayer d'utiliser une fonction directement comme ceci (success : OnSuccess(productID)). Mais vous devez d'abord passer une fonction anonyme :

  function callWebService(cartObject) {

    $.ajax({
      type: "POST",
      url: "http://localhost/AspNetWebService.asmx/YourMethodName",
      data: cartObject,
      contentType: "application/x-www-form-urlencoded",
      dataType: "html",
      success: function () {
        OnSuccess(cartObject.productID)
      },
      error: function () {
        OnError(cartObject.productID)
      },
      complete: function () {
        // Handle the complete event
        alert("ajax completed " + cartObject.productID);
      }
    });  // end Ajax        
    return false;
  }

Si vous n'utilisez pas une fonction anonyme comme enveloppe OnSuccess est appelé même si le webservice renvoie une exception.

6 votes

Cela n'a rien à voir avec ajax, ni jquery, ni handlers. On pourrait tout aussi bien avoir un commentaire rappelant que "l'ensemble du code doit être enveloppé dans une balise script". L'explication est fausse : il n'est pas nécessaire d'envelopper quoi que ce soit dans des fonctions anonymes, une fonction nommée fera l'affaire, pour autant que vous la passiez au lieu de l'appeler. De plus, elle est trompeuse : OnSuccess est appelé avant même que la requête ne soit envoyée, il n'y a donc aucun sens à le relier à un service Web qui renvoie quelque chose.

0 votes

Cette réponse m'a aidé, mais je n'ai pas upvote, vous devriez mettre à jour votre réponse selon le commentaire de @fdreger.

17voto

Allen Points 417

J'ai essayé de supprimer la ligne dataType et cela n'a pas fonctionné pour moi. J'ai contourné le problème en utilisant "complete" au lieu de "success" comme callback. Le rappel de réussite échoue toujours dans IE, mais comme mon script s'exécute et se termine de toute façon, c'est tout ce qui m'importe.

$.ajax({
    type: 'POST',
    url: 'somescript.php',
    data: someData,
    complete: function(jqXHR) {
       if(jqXHR.readyState === 4) {
          ... run some code ... 
       }   
    }        
 });

dans jQuery 1.5, vous pouvez aussi le faire comme ceci.

var ajax = $.ajax({
    type: 'POST',
    url: 'somescript.php',
    data: 'someData'
});
ajax.complete(function(jqXHR){
    if(jqXHR.readyState === 4) {
        ... run some code ... 
    }
});

11 votes

Juste une remarque à ce sujet. complete sera toujours appelé, que l'appel ajax ait réussi ou non, alors que success n'est appelé que si le serveur web répond avec un 200 OK En-tête HTTP (tout est OK).

10voto

Delfin Points 21

Assurez-vous de ne pas imprimer (echo ou print) de texte/données avant de générer vos données formatées en JSON dans votre fichier PHP. Cela pourrait expliquer que vous obteniez un -sucessfull 200 OK- mais que votre événement de succès échoue toujours dans votre javascript. Vous pouvez vérifier ce que votre script reçoit en vérifiant la section "Network - Answer" dans firebug pour le POST submit1.php.

0 votes

Cela m'a vraiment aidé. Je sais que c'est une vieille réponse mais c'était exactement le problème que j'avais. Utiliser des echo's ou des print_r's pendant le débogage et découvrir qu'ils causent en fait le bug... :) Merci !

0 votes

6 ans plus tard, je continue à aider les gens avec cette réponse ! Je n'aurais pas su où chercher autrement.

7voto

David Hedlund Points 66192

Mettez un alert() dans votre success pour s'assurer qu'il est bien appelé.

Si ce n'est pas le cas, c'est simplement parce que la requête n'a pas abouti, même si vous avez réussi à toucher le serveur. Les causes raisonnables peuvent être l'expiration d'un délai d'attente ou une exception dans votre code php.

Installez l'addon firebug pour firefox, si ce n'est pas déjà fait, et inspectez le callback AJAX. Vous serez en mesure de voir la réponse, et si elle reçoit ou non une réponse réussie (200 OK). Vous pouvez également mettre un autre alert() dans le complete qui doit absolument être invoquée.

0 votes

Merci pour votre réponse. J'ai essayé l'alerte dans l'événement de réussite mais cela n'a pas fonctionné. J'ai l'addon firebug pour firefox et il reçoit une réponse positive (200 OK), donc pas de problème. J'ai une fonction die appelée dans mon fichier php pour toute erreur et lorsque je la vérifie dans firebug, elle montre une réponse correcte. Que voulez-vous dire par "Vous pouvez également mettre un autre alert() dans le callback complet, qui devrait certainement être invoqué" ? Merci beaucoup pour votre réponse rapide

2 votes

Si vous ne voyez pas l'alerte dans votre success puisque la réponse est 200 OK, la réponse de Tatu semble raisonnable, mais pour un dépannage plus approfondi, vous pouvez utiliser un autre événement, appelé complete qui est toujours invoqué, qu'une demande aboutisse ou non ( success ne se produit que si la demande est réussie). complete: function (xhr, status) { alert('complete: '+status); }

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X