182 votes

Comment effacer les messages d'erreur de validation de jQuery ?

J'utilise le plugin de validation jQuery pour la validation côté client. Fonction editUser() est appelé en cas de clic sur le bouton "Modifier l'utilisateur", qui affiche des messages d'erreur.

Mais je veux effacer les messages d'erreur sur mon formulaire, lorsque je clique sur le bouton "Effacer", qui appelle une fonction distincte. clearUser() .

function clearUser() {
    // Need to clear previous errors here
}

function editUser(){
    var validator = $("#editUserForm").validate({
        rules: {
            userName: "required"
        },
        errorElement: "span",
        messages: {
            userName: errorMessages.E2
        }
    });

    if(validator.form()){
        // Form submission code
    }
}

227voto

Parrots Points 10968

Vous voulez le resetForm() méthode :

var validator = $("#myform").validate(
   ...
   ...
);

$(".cancel").click(function() {
    validator.resetForm();
});

Je l'ai pris à la source de une de leurs démos .

Note : Ce code ne fonctionnera pas pour Bootstrap 3.

33 votes

Pour ceux qui utilisent le bootstrap, il y a des cas où resetForm() n'efface pas toutes les instances de .error sur les éléments enfants du formulaire. Cela laissera des résidus de CSS comme la couleur rouge du texte, à moins que vous n'appeliez la fonction .removeClass() . Exemple : $('#myform .control-group').removeClass('error');

14 votes

En utilisant bootstrap 3, cela ne masque pas les erreurs de validation des champs. Quel dommage.

2 votes

Cela fonctionne pour moi avec Bootstrap 3. Peut-être le problème vient-il de votre intégration des deux bibliothèques ?

134voto

Travis J Points 28588

J'ai moi-même rencontré ce problème. J'avais besoin de valider conditionnellement des parties d'un formulaire pendant que celui-ci était construit en fonction des étapes (c'est-à-dire que certaines entrées étaient ajoutées dynamiquement pendant l'exécution). Par conséquent, une liste déroulante de sélection devait parfois être validée, et parfois non. Cependant, à la fin de l'épreuve, elle devait être validée. Par conséquent, j'avais besoin d'une méthode robuste qui ne soit pas une solution de rechange. J'ai consulté le code source de jquery.validate .

Voici ce que j'ai trouvé :

  • Effacer les erreurs en indiquant le succès de la validation
  • Gestionnaire d'appel pour l'affichage des erreurs
  • Effacer tout le stockage des succès ou des erreurs
  • Réinitialiser toute la validation du formulaire

    Voici à quoi cela ressemble en code :

    function clearValidation(formElement){
     //Internal $.validator is exposed through $(form).validate()
     var validator = $(formElement).validate();
     //Iterate through named elements inside of the form, and mark them as error free
     $('[name]',formElement).each(function(){
       validator.successList.push(this);//mark as error free
       validator.showErrors();//remove error messages if present
     });
     validator.resetForm();//remove error class on name elements and clear history
     validator.reset();//remove all error and success data
    }
    //used
    var myForm = document.getElementById("myFormId");
    clearValidation(myForm);

    minifié comme une extension jQuery :

    $.fn.clearValidation = function(){var v = $(this).validate();$('[name]',this).each(function(){v.successList.push(this);v.showErrors();});v.resetForm();v.reset();};
    //used:
    $("#formId").clearValidation();

2 votes

C'est génial, cette solution fonctionne aussi avec "ValidationMessageFor".

1 votes

Super ! Fonctionne parfaitement avec Bootstrap et MVC !

3 votes

Tout d'abord, merci ! Je l'ai fait fonctionner à merveille pendant des années, mais j'ai découvert un problème de performances : showErrors effectue une manipulation du DOM et est appelée pour chaque élément du formulaire. Le navigateur s'est figé pendant quelques secondes lors de l'utilisation de ce code sur un formulaire comportant ~ 30 contrôles. La solution pour moi a été de déplacer showErrors hors de la boucle et l'appeler une seule fois juste avant validator.resetForm . Pour autant que je sache, il se comporte exactement de la même manière et est beaucoup plus rapide.

59voto

Nick Craver Points 313913

Si vous voulez simplement cacher les erreurs :

$("#clearButton").click(function() {
  $("label.error").hide();
  $(".error").removeClass("error");
});

Si vous avez spécifié l'option errorClass appeler cette classe pour la cacher à la place error (le défaut) que j'ai utilisé ci-dessus.

2 votes

@mark - correct, mais ce n'est pas prévu... ils sont toujours invalides, nous cachons simplement les messages d'erreur dans ce cas. Il s'agit d'une alternative à la réponse acceptée pour les cas où vous spécifiquement vous voulez masquer (et non pas ignorer, par exemple interdire la soumission) les erreurs. Cela arrive plus souvent qu'on ne le pense :)

2 votes

Le problème se pose lorsque vous réinitialisez le formulaire et le modifiez à nouveau. Ma boîte de dialogue d'erreur affiche le nombre d'erreurs et ce nombre ne cesse de s'accumuler. Même l'option "resetForm" n'est d'aucune utilité.

2 votes

J'ai même fait ça, mais ça mène à un autre problème. Les validations ne s'appliquent pas la prochaine fois que le dialogue s'ouvre !

50voto

Juri Points 14330

Si vous n'avez pas précédemment sauvegardé les validateurs à part lors de leur attachement au formulaire, vous pouvez aussi simplement invoquer

$("form").validate().resetForm();

comme .validate() retournera les mêmes validateurs que vous avez attachés précédemment (si vous l'avez fait).

0 votes

Cela a fonctionné, mais si un symbole de croix est disponible dans le champ de saisie, vous devez également ajouter $('.is-invalid').removeClass('is-invalid') ;

20voto

Meower68 Points 168

Malheureusement, validator.resetForm() ne fonctionne PAS, dans de nombreux cas.

J'ai un cas où, si quelqu'un appuie sur le bouton "Soumettre" d'un formulaire contenant des valeurs vides, le bouton "Soumettre" doit être ignoré. Pas d'erreur. C'est assez simple. Si quelqu'un saisit un ensemble partiel de valeurs et appuie sur "Envoyer", certains champs devraient être signalés comme contenant des erreurs. En revanche, s'il efface ces valeurs et appuie à nouveau sur "Envoyer", les erreurs devraient disparaître. Dans ce cas, pour une raison quelconque, il n'y a pas d'éléments dans le tableau "currentElements" du validateur. .resetForm() ne fait absolument rien.

Il y a des bugs postés à ce sujet.

Jusqu'à ce qu'ils les corrigent, vous devez utiliser la réponse de Nick Craver, PAS la réponse acceptée par les perroquets.

0 votes

Ce n'est que dans le monde JavaScript que cet état de fait est acceptable.

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