196 votes

jQuery Validate - Activer la validation des champs cachés

Dans la nouvelle version de jQuery validation plugin 1.9 par défaut la validation des champs cachés est ignorée . J'utilise CKEditor pour le champ d'entrée textarea et il masque le champ et le remplace par un iframe. Le champ est là, mais la validation est désactivée pour les champs cachés. Avec le plugin de validation version 1.8.1, tout fonctionne comme prévu.

Ma question est donc de savoir comment activer la validation des champs cachés avec le plugin de validation v1.9.

Ce paramètre ne fonctionne pas :

$.validator.setDefaults({ ignore: '' });

1 votes

0 votes

Le lien pour "validation des champs cachés ignorée" est mort.

0 votes

La validation fonctionne par défaut pour moi avec <input type="text" name="myfield" id="myfield" required="required" style="display: none;"> . Je n'ai pas eu à modifier les paramètres ou à faire quoi que ce soit de spécial.

338voto

Sparky Points 36014

L'auteur du plugin indique que vous devez utiliser "crochets sans les guillemets" , []

http://bassistance.de/2011/10/07/release-validation-plugin-1-9-0/

Release : Plugin de validation 1.9.0 : "...Un autre changement devrait rendre la configuration des formulaires avec des éléments cachés plus facile, ceux-ci sont maintenant ignorés par défaut (l'option "ignore" a ":hidden" maintenant par défaut). En théorie, cela pourrait casser une configuration existante. Dans le cas peu probable où cela se produirait, vous pouvez y remédier en en définissant l'option "ignore" par "[]" (crochets sans les guillemets). guillemets)."

Pour modifier ce paramètre pour tous les formulaires :

$.validator.setDefaults({ 
    ignore: [],
    // any other default options and/or rules
});

(Il n'est pas nécessaire que .setDefaults() être dans le document.ready fonction)

OU pour un formulaire spécifique :

$(document).ready(function() {

    $('#myform').validate({
        ignore: [],
        // any other options and/or rules
    });

});

EDITAR :

Voir cette réponse pour savoir comment activer la validation de certains champs cachés tout en ignorant les autres.


EDIT 2 :

Avant de laisser des commentaires qui "cela ne fonctionne pas" Gardez à l'esprit que le PO demande simplement des informations sur le plugin jQuery Validate et sa question a rien à la façon dont ASP.NET, MVC ou tout autre cadre Microsoft peut modifier le comportement normal attendu de ce plugin. Si vous utilisez un framework Microsoft, le fonctionnement par défaut du plugin jQuery Validate est écrasé par le plugin Microsoft unobtrusive-validation plugin.

Si vous vous battez avec le unobtrusive-validation veuillez alors vous référer à cette réponse : https://stackoverflow.com/a/11053251/594235

28 votes

Peut-être que le mauvais votant peut me donner un retour constructif. Sinon, la réponse est entièrement autonome, correctement sourcée, donne des exemples de code, et est techniquement correcte selon l'auteur du plugin.

0 votes

Notez que setDefaults doit également être appelé à l'intérieur de $(document).ready(function() { }) afin de travailler

1 votes

@StijnVanBael, non, c'est faux. Voir : jsfiddle.net/F4w92/1 et voir aussi mon deuxième commentaire sur réponse de jerick .

79voto

James Morcom Points 679

Cela a fonctionné pour moi, dans un site ASP.NET MVC3 où j'avais laissé le cadre pour configurer une validation discrète, etc. au cas où cela serait utile à quelqu'un :

$("form").data("validator").settings.ignore = "";

2 votes

J'aime aussi celle-ci car elle me permet de le faire dans certaines circonstances, plutôt que de modifier le comportement par défaut.

5 votes

J'ai dû procéder de cette façon, car l'utilisation de .validate() pour modifier les options ne fonctionnait pas.

1 votes

C'est la solution correcte pour la validation non intrusive, j'ai essayé toutes les autres solutions, elles pourraient fonctionner dans le cas où vous n'utilisez pas la validation non intrusive. Si vous utilisez unobtrusive, voici le bon endroit.

66voto

jerick Points 319

Assurez-vous de mettre

 $.validator.setDefaults({ ignore: '' });

PAS à l'intérieur de $(document).ready

2 votes

Excellente réponse. Un lien vers la documentation est utile pour que les gens apprennent, mais une réponse directe est plus précieuse. L'OP était sur la bonne voie, mais le fait de le mettre en dehors de $(document).ready est l'astuce.

4 votes

@KevinZych, Apparemment, cela ne fait absolument aucune différence si $.validator.setDefaults() est placé à l'intérieur ou à l'extérieur du DOM ready hander. Comparez ce jsFiddle a ce jsFiddle .

0 votes

Intéressant @Sparky, vos violons sont une excellente preuve. Il faudrait que je revienne en arrière et que je regarde le code que j'ai corrigé en utilisant cette solution pour savoir pourquoi je suis arrivé à la conclusion qu'il devait être à l'intérieur du DOM ready handler. Il doit y avoir une autre raison.

30voto

JustinMichaels Points 730

Je vais donc vous expliquer un peu plus en détail pourquoi cela ne fonctionne pas, car je suis le genre de personne qui ne peut pas dormir la nuit sans le savoir. J'utilise jQuery validate 1.10 et Microsoft jQuery Unobtrusive Validation 2.0.20710.0 qui a été publié le 29/01/2013.

J'ai commencé par rechercher la méthode setDefaults dans jQuery Validate et je l'ai trouvée à la ligne 261 du fichier non modifié. Tout ce que cette fonction fait réellement est de fusionner vos paramètres json avec les paramètres existants de la fonction $.validator.defaults qui sont initialisés avec la propriété ignore définie sur ":hidden" ainsi que les autres valeurs par défaut définies dans jQuery Validate. Donc, à ce stade, nous avons remplacé la propriété ignore. Voyons maintenant où cette propriété defaults est référencée.

Quand j'ai parcouru le code pour voir où $.validator.defaults est référencé. J'ai remarqué qu'il était uniquement utilisé par le constructeur d'un validateur de formulaire, ligne 170 dans le fichier non modifié de jQuery validate.

// constructor for validator
$.validator = function( options, form ) {
    this.settings = $.extend( true, {}, $.validator.defaults, options );
    this.currentForm = form;
    this.init();
};

À ce stade, le validateur fusionne tous les paramètres par défaut qui ont été définis et les joint au validateur de formulaire. Lorsque vous regardez le code qui effectue la validation, la mise en évidence, le retrait de la mise en évidence, etc., il utilise tous l'objet validator.settings pour extraire la propriété ignore. Nous devons donc nous assurer que si nous devons définir la propriété ignore avec la méthode setDefaults, cela doit se produire avant l'appel de $("form").validate().

Si vous utilisez Asp.net MVC et le plugin discret, vous vous rendrez compte après avoir regardé le javascript que la validation est appelée dans document.ready. J'ai également appelé mon setDefaults dans le bloc document.ready qui va s'exécuter après les scripts, jquery validate et unobtrusive parce que j'ai défini ces scripts dans le html avant celui qui contient l'appel. Donc mon appel n'a évidemment pas eu d'impact sur la fonctionnalité par défaut qui consiste à ignorer les éléments cachés pendant la validation. Il y a deux options ici.

Option 1 - Vous pourriez comme Juan Mellado l'a fait remarquer avoir l'appel en dehors du document.ready qui s'exécuterait dès que le script a été chargé. Je ne suis pas sûr du timing de ceci puisque les navigateurs sont maintenant capables de faire un chargement parallèle du script. Si je suis juste trop prudent alors s'il vous plaît corrigez-moi. En outre, il existe probablement des moyens de contourner ce problème, mais pour mes besoins, je n'ai pas emprunté cette voie.

Option 2a - Le pari le plus sûr à mes yeux est de simplement remplacer le $.validator.setDefaults({ ignore: '' }); à l'intérieur de l'événement document.ready avec $("form").data("validator").settings.ignore = ""; . Ceci modifiera la propriété ignore qui est effectivement utilisée par jQuery validate lors de chaque validation sur vos éléments pour le formulaire donné.

Options 2b - Après avoir examiné le code un peu plus en détail, vous pourriez également utiliser les éléments suivants $("form").validate().settings.ignore = ""; comme moyen de définir la propriété "ignorer". La raison en est qu'en regardant la fonction de validation, elle vérifie si un objet de validation a déjà été enregistré pour l'élément de formulaire via l'attribut $.data() fonction. Si elle trouve un objet validateur stocké avec l'élément de formulaire, elle renvoie simplement l'objet validateur au lieu d'en créer un autre.

0 votes

Merci pour cette réponse détaillée !

0 votes

Bon travail, car la réponse de l'OP n'a pas fonctionné pour moi en MVC 5.

0 votes

Votre analyse m'a beaucoup aidé à résoudre un de mes problèmes de validation. +1

9voto

Kiran Points 66

Je viens d'ajouter ignore: [] dans la page spécifique pour le formulaire spécifique, cette solution a fonctionné pour moi.

$("#form_name").validate({
        ignore: [],
        onkeyup: false,
        rules: {            
        },      
        highlight:false,
    });

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