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.
1 votes
Voir aussi stackoverflow.com/questions/7952181/
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.