L'événement de succès Ajax ne fonctionne pas

j'ai un formulaire d'inscription et j'utilise $.ajax pour le soumettre.

C'est ma demande 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;        
    });
});

Dans mon submit1.php fichier je vérifie l'existence des champs email address et username dans la base de données. Je souhaite afficher un message d'erreur si cette valeur existe sans rafraîchir la page .

Comment puis-je ajouter ceci au succès Rappel de ma requête AJAX?

159
demandé sur Liam 2009-12-28 16:31:04

13 réponses

le résultat n'est probablement pas dans le format JSON, donc quand jQuery essaie de le parser comme tel, il échoue. Vous pouvez attraper l'erreur avec la fonction de rappel error: .

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

331
répondu Tatu Ulmanen 2009-12-28 13:41:56

bien que le problème soit déjà résolu, j'ajoute ceci dans l'espoir qu'il aidera les autres.

j'ai fait l'erreur et j'ai essayé d'utiliser une fonction directement comme celle-ci (success: OnSuccess(productID)). Mais il faut 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 wrapper OnSuccess est appelé même si le service web renvoie une exception.

14
répondu js newbee 2010-09-19 13:19:46

j'ai essayé de supprimer la ligne de type de données et cela n'a pas fonctionné pour moi. J'ai contourné le problème en utilisant "complet" au lieu de "succès" comme rappel. Le succès de callback échoue toujours dans IE, mais puisque mon script court et 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 ... 
    }
});
14
répondu Allen 2011-03-19 13:35:48

assurez-vous que vous n'imprimez pas (echo ou print) de texte/données avant de générer vos données formatées JSON dans votre fichier PHP. Cela pourrait expliquer que vous obtenez un-sucessfull 200 OK-mais votre événement sucess échoue toujours dans votre javascript. Vous pouvez vérifier ce que votre script reçoit en cochant la section "Network - Answer" dans firebug pour le post submit1.php.

10
répondu Delfin 2012-02-17 23:28:14

mettez un alert() dans votre success pour vous assurer qu'il est appelé.

si ce n'est pas le cas, c'est simplement parce que la requête n'a pas réussi du tout, même si vous parvenez à atteindre le serveur. Les causes raisonnables pourrait être qu'un délai expire, ou quelque chose dans votre code php jette une exception.

installez l'addon firebug pour firefox, si vous ne l'avez pas déjà fait, et inspectez le rappel AJAX. Vous serez en mesure de voir les réponse, et si elle reçoit ou non une réponse réussie (200 OK). Vous pouvez aussi mettre un autre alert() dans le rappel complete , qui devrait certainement être invoqué.

4
répondu David Hedlund 2009-12-28 13:40:09

j'ai eu le même problème. cela se produit parce que javascript s'attendre json type de données dans le retour des données. mais si vous utilisez echo ou print dans votre php cette situation se produire. si vous utilisez la fonction echo dans php pour retourner des données, il suffit de supprimer dataType : "json" qui fonctionne assez bien.

3
répondu Thusitha Wickramasinghe 2016-04-10 06:46:50

je retournais JSON valide, obtenant une réponse de 200 dans mon rappel" complet", et j'ai pu le voir dans la console réseau chrome... Mais je n'avais pas précisé

dataType: "json"

une fois que j'ai fait, contrairement à la "réponse acceptée", qui a en fait corrigé le problème.

1
répondu sarink 2013-10-31 15:30:39

j'ai eu ce problème en utilisant une fonction ajax pour récupérer le mot de passe de Magento. L'événement de succès n'a pas été tiré, puis j'ai réalisé qu'il y avait deux erreurs:

  1. le résultat n'a pas été retourné dans le format JSON
  2. j'essayais de convertir un tableau au format JSON, mais ce tableau avait des caractères non-utf

ainsi chaque fois que j'ai essayé d'utiliser json_eoncde() pour coder le tableau de retour, le fonction ne fonctionnait pas parce que l'un de ses index avait des caractères non-utf, la plupart d'entre eux accentuation dans les mots portugais brésiliens.

1
répondu Andresa Krul 2015-12-03 11:08:26

j'ai essayé de retourner la chaîne du contrôleur mais pourquoi le contrôle de retour au bloc d'erreur pas dans le succès d'ajax

var sownum="aa";
$.ajax({
    type : "POST",
    contentType : 'application/json; charset=utf-8',
    dataType : "JSON",
    url : 'updateSowDetails.html?sownum=' + sownum,
    success : function() {
        alert("Wrong username");
    },
    error : function(request, status, error) {

        var val = request.responseText;
        alert("error"+val);
    }
});
1
répondu user7285134 2016-12-12 13:37:53

j'ai fait face au même problème en interrogeant le contrôleur qui ne renvoie pas la réponse de succès, lorsque modifié mon contrôleur pour retourner le problème de message de succès a été résolu. remarque à l'aide de Lavalite cadre. avant:

public function Activity($id)
    {
        $data=getData();
        return
            $this->response->title('title')
                ->layout('layout')
                ->data(compact('data'))
                ->view('view')
                ->output();
    }
after code looks like:
    try {
            $attributes = $request->all();
            //do something
            return $this->response->message('')
                ->code(204)
                ->status('success')
                ->url('url'. $data->id)
                ->redirect();
        } catch (Exception $e) {
            return $this->response->message($e->getMessage())
                ->code(400)
                ->status('error')
                ->url('nothing Wrong')
                ->redirect()
        }

cela a fonctionné pour moi

1
répondu masokaya 2018-07-06 10:13:40

j'utilise XML pour rapporter le résultat du php sur le serveur à la page Web et j'ai eu le même comportement.

dans mon cas , la raison était que l'étiquette de fermeture ne correspondait pas à l'étiquette d'ouverture.

<?php
....
header("Content-Type: text/xml");
echo "<?xml version=\"1.0\" encoding=\"utf-8\"?>
    <result>
        <status>$status</status>
        <OPENING_TAG>$message</CLOSING_TAG>
    </result>";
?>
0
répondu thowa 2015-10-28 13:54:19

dans mon cas, l'erreur était celle du côté serveur et pour cette raison il retournait un html

wp_nonce_field(basename(__FILE__), "mu-meta-box-nonce");
0
répondu Emiliano Barboza 2017-06-30 14:25:51

Le le succès de rappel prend deux arguments:

success: function (data, textStatus) { }

assurez-vous également que le submit1.php définit le bon en-tête content-type: application/json

-5
répondu Darin Dimitrov 2009-12-28 13:36:38