jQuery form plugin, pas de gestion des erreurs

il semble qu'il n'y ait pas de facilité de traitement des erreurs dans le Jquery.Form plugin, ce qui est très frustrant. Même si la documentation dit que nous pouvons utiliser le $.options ajax, Je ne peux toujours pas utiliser l'option' error ' lorsque le serveur renvoie une erreur, en particulier les séries 500 et 400. Est-ce que ce plugin ne peut gérer aucune erreur du serveur ou est-ce un bug, etc? Quelqu'un peut-il me dire comment je peux gérer les erreurs (400, 500,...) avec ce plugin? J'ai besoin de votre aide... Tout Ce Que Je want est un traitement d'erreur simple... Remercier.

$("#uploadingImg").hide();

var options = {//Define ajax options
    type: "post",
    target: "#responsePanel",
    beforeSend: function(){
        $("#uploadingImg").show();
    },
    complete: function(xhr, textStatus){
        $("#uploadingImg").hide();
    },
    success: function(response, statusString, xhr, $form){
        // I know what to do here since this option works fine
    },
    error: function(response, status, err){
        // This option doesn't catch any of the error below, 
        // everything is always 'OK' a.k.a 200
        if(response.status == 400){
            console.log("Sorry, this is bad request!");
        }
        if(response.status == 601){
            sessionTimedOut();
        }
    }
}
$("#polygonUploadForm").submit(function(){
    $(this).ajaxSubmit(options); // Using the jquery.form plugin
    return false;
});
17
demandé sur JCotton 2010-10-22 13:06:23

5 réponses

le Plugin jQuery Form gérer les erreurs et les documentation a raison de dire qu'il peut utiliser le $.options ajax. Cependant, il y a deux modes dans lesquels le plugin s'exécute - normal et File upload. Le problème que vous avez est que vous effectuez un téléchargement de fichiers. (Vous ne dites pas cela mais vous avez " # uploadingImg "et" #polygonUploadForm " et, raisonnement récursif, vous avez ce problème.)

C'est en d'autres termes, mais vous ne pouvez pas télécharger un fichier avec AJAX. Cette solution consiste à utiliser une iframe. Form submit affiche une requête HTTP normale et charge la réponse du serveur dans l'iframe. Le plugin saisit la réponse et voilà. parce que cela se produit comme une requête HTTP normale, les règles et les comportements de $.ajax ne s'applique pas (car il n'est pas utilisé). La seule chose que Form plugin peut faire est de traiter tout ce qu'il obtient comme un succès. En termes de code, le téléchargement de fichier ne déclenchera jamais l '"erreur" attribut assigné à ajaxForm() ou ajaxSubmit(). Si vous voulez vraiment prouver que ce n'est pas une requête AJAX, attachez un handler ajaxComplete() au formulaire (c'est-à-dire complètement indépendant des méthodes du plugin de formulaire). Il ne sera pas déclenché. Ou regardez le panneau Net->XHR de Firebug.

Donc, c'est que le téléchargement n'est pas une requête AJAX. Le mieux que vous puissiez faire est de travailler avec les callbacks 'success' ou 'complete' d'ajaxForm()/ajaxSubmit(). Vous êtes limité sans accès au Code de réponse HTTP, mais vous pouvez examiner la réponse. Si la réponse est vide ou non ce que vous attendez, vous pouvez déclencher le "erreur" de rappel en appelant xhr.abort(). Au lieu de faire " si (bonne réponse) {yay!} else {oh non!} ", appeler abort () et déclencher 'error' rend le code un peu plus propre et plus compréhensible IMHO. Voici un exemple de code:

$("#uploadForm").ajaxForm({
    success: function(response, textStatus, xhr, form) {
        console.log("in ajaxForm success");

        if (!response.length || response != 'good') {
            console.log("bad or empty response");
            return xhr.abort();
        }
        console.log("All good. Do stuff");
    },
    error: function(xhr, textStatus, errorThrown) {
        console.log("in ajaxForm error");
    },
    complete: function(xhr, textStatus) {
        console.log("in ajaxForm complete");
    }
});

une réponse de mauvaise volonté va l'imprimer dans le journal de la console:

[jquery.form] state = uninitialized
"NetworkError: 404 NOT FOUND - http://server/fileupload/"
[jquery.form] state = loading
[jquery.form] isXml=false
in ajaxForm success
bad or empty response
[jquery.form] aborting upload... aborted
in ajaxForm error
in ajaxForm complete
in ajaxForm complete

je ne sais pas pourquoi le "complet" rappel est exécuté deux fois par quelqu'un? Une dernière chose, lire ce fil si vous demandez pourquoi jQuery ou le plugin Form ne peuvent pas simplement lire les en-têtes HTTP de l'iframe.

49
répondu JCotton 2017-05-23 11:54:19

Viens de découvrir que le jquery.form plugin lui-même ne gère pas l'erreur du serveur, car il n'a pas accès aux en-têtes de réponse en raison de la façon dont la balise "file input" gère le téléchargement de fichiers. Donc je pense que le W3C doit revoir cette balise gênante qui non seulement ne vous permet pas de la coiffer avec CSS mais ne rend pas la gestion de la réponse du Serveur Facile.

Il doit y avoir un moyen de contourner cela...

Laissez-moi savoir si j'ai dit quelque chose de mal, et laissez-moi savoir votre réflexions sur cette balise 'file input'...

1
répondu Shaoz 2010-10-25 11:14:08

jQuery form Plugin gérer le succès de l'état de la réponse du serveur (code 200), je pense que l'information est suffisante.

à partir de cela, vous pouvez créer votre côté serveur de statut de réponse

            return $this->returnJson(array(
                'response' => 'success',//error or whatever
                'data' => 'Succesfully saved in the database'
            ));

bien sûr returnJson est une fonction pour envoyer les données Json (vous pouvez en construire une ou faire à l'intérieur de votre méthode)

dans la poignée frontend on success (est déclenché lorsque la réponse est 200), vous avez juste besoin de vérifier votre champ status (dans ce cas 'response'), exemple ci-dessous:

  var options = {
        dataType : 'json',
        success: handleResponse
    };


    function handleResponse (responseText, statusText, xhr, $form){

          if(responseText.response == 'success') {
                  //do something

                }else if(responseText.response == 'error'){
                    //do something

            }


    }
1
répondu Riccardo Rich Giacomelli 2015-01-16 08:54:18

dans options

var options = { 
    target:        '#output2',    
    beforeSubmit:  showRequest,   
    success:       showResponse,  
timeout:    1000
}; 

il n'y a pas de déclenchement d'appel en cas d'erreur. Le plugin se bloque quand vous obtenez un 500 ou un 404. Le succès ne consiste qu'à agir sur le "succès", c'est donc tout ce que nous avons pour le moment.

0
répondu NickOpris 2011-01-25 11:04:40

Pour tout le monde encore besoin de cela, c'est une façon de la faire fonctionner

function submitForm()
{
    var isSuccess   = false,
        options = {
            url         : "posturl.php",
            type        : 'POST',
            dataType    : 'json',
            success:function(msg) {
                //set the variable to true
                isSuccess = true;

                //do whatever
            },
            complete: function () {
                if (isSuccess === false) {
                    //throw the error message
                }
            }
        };

    //Ajax submit the form
    $('#your_form').ajaxSubmit(options);

    // always return false to prevent standard browser submit and page navigation
    return false;
 }
0
répondu Ruben Benjamin 2014-12-17 21:44:50