Je vais donc aller un peu plus loin pour expliquer pourquoi cela ne fonctionne pas parce que je suis le genre de personne qui ne peut pas dormir la nuit sans savoir haha. J'utilise jQuery validate 1.10 et Microsoft jQuery Unobtrusive Validation 2.0.20710.0 qui a été publié le 29/1/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 réduit. Tout ce que cette fonction fait vraiment est de fusionner vos paramètres json dans les paramètres existants $.validator.defaults
qui sont initialisés avec la propriété ignore définie sur ": hidden" avec les autres valeurs par défaut définies dans jQuery Validate. Donc, à ce stade, nous avons remplacé ignorer. Voyons maintenant où cette propriété par défaut est référencée.
Quand j'ai tracé à travers le code pour voir où $.validator.defaults
est référencé. J'ai remarqué qu'il n'était utilisé que par le constructeur pour un validateur de formulaire, ligne 170 dans jQuery validate un fichier non minifié.
// constructor for validator
$.validator = function( options, form ) {
this.settings = $.extend( true, {}, $.validator.defaults, options );
this.currentForm = form;
this.init();
};
À ce stade, un validateur fusionnera tous les paramètres par défaut définis et les attachera au validateur de formulaire. Lorsque vous regardez le code qui effectue la validation, la mise en évidence, la désactivation, etc., ils utilisent tous l'objet validator.settings pour extraire la propriété ignore. Nous devons donc nous assurer que si nous devons définir ignore avec la méthode setDefaults, cela doit se produire avant que le $ ("form"). Validate () ne soit appelé.
Si vous utilisez Asp.net MVC et le plugin discret, vous vous rendrez compte après avoir regardé le javascript que validate est appelé 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 discret car j'ai défini ces scripts dans le html avant celui qui contient l'appel. Donc, mon appel n'a évidemment eu aucun impact sur la fonctionnalité par défaut de sauter les éléments cachés lors de la validation. Il y a quelques options ici.
Option 1 - Vous pouvez, comme l'a souligné Juan Mellado, avoir l'appel en dehors du document.ready qui s'exécuterait dès que le script aurait été chargé. Je ne suis pas sûr du moment choisi car les navigateurs sont désormais capables de charger des scripts en parallèle. Si je suis juste trop prudent, veuillez me corriger. En outre, il y a probablement des moyens de contourner ce problème, mais pour mes besoins, je n'ai pas suivi cette voie.
Option 2a - La valeur sûre à mes yeux est de simplement remplacer l' $.validator.setDefaults({ ignore: '' });
intérieur de l'événement document.ready par $("form").data("validator").settings.ignore = "";
. Cela modifiera la propriété ignore qui est réellement utilisée par jQuery validate lors de chaque validation sur vos éléments pour le formulaire donné.
Options 2b - Après avoir examiné un peu plus le code, vous pouvez également l'utiliser $("form").validate().settings.ignore = "";
comme moyen de définir la propriété ignore. La raison en est qu'en regardant la fonction de validation, il vérifie si un objet de validation a déjà été stocké pour l'élément de formulaire via la $.data()
fonction. S'il trouve un objet validateur stocké avec l'élément form, il renvoie simplement l'objet validateur au lieu d'en créer un autre.