web-dev-qa-db-fra.com

jQuery Validate - Activer la validation pour les champs cachés

Dans la nouvelle version du plugin de validation jQuery 1.9 par défaut la validation des champs cachés est ignorée . J'utilise CKEditor pour le champ de saisie textarea qui le masque et le remplace par 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 plug-in de validation v1.9.

Ce paramètre ne fonctionne pas: 

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

L'auteur du plugin dit que vous devriez utiliser "des crochets" sans les guillemets ", []

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

Version: Plugin de validation 1.9.0: "... Un autre changement devrait faciliter la configuration des formulaires avec des éléments cachés, ceux-ci sont désormais ignorés par défaut ( L’option “ignorer” a “: caché” maintenant par défaut). En théorie, cela pourrait casser une configuration existante. Dans le cas peu probable où cela se produirait, vous pouvez le corriger en réglant l’option ignore à “[]” (carré crochets sans les 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() soit dans la fonction document.ready)

OU pour un formulaire spécifique:

$(document).ready(function() {

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

});

EDIT:

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


EDIT 2 :

Avant de laisser des commentaires qui "cela ne fonctionne pas" , gardez à l'esprit que l'OP demande simplement à propos de le plugin jQuery Validate et que sa question a rien à faire avec la manière dont ASP.NET, MVC ou tout autre framework Microsoft peut modifier le comportement normal attendu de ce plugin. Si vous utilisez une infrastructure Microsoft, le fonctionnement par défaut du plug-in jQuery Validate est écrasé par le plug-in unobtrusive-validation de Microsoft.

Si vous avez des difficultés avec le plug-in unobtrusive-validation, veuillez vous référer à cette réponse: https://stackoverflow.com/a/11053251/594235

307
Sparky

Cela a fonctionné pour moi, au sein d'un site ASP.NET MVC3 où j'avais quitté le cadre pour configurer une validation non intrusive, etc., au cas où cela serait utile à quiconque:

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

Assurez-vous de mettre 

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

NOTinside $(document).ready

63
jerick

Donc, je vais aller un peu plus loin pour comprendre 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/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 minié. Tout ce que fait cette fonction est de fusionner vos paramètres json avec le $.validator.defaults existant, qui est initialisé avec la propriété ignore étant définie sur ": hidden" avec les autres valeurs par défaut définies dans jQuery Validate. Donc, à ce stade, nous avons ignoré ignorer. Voyons maintenant où cette propriété par défaut est référencée.

Lorsque j'ai parcouru le code pour voir où $.validator.defaults est référencé. J'ai remarqué que le constructeur ne l'utilisait que pour un validateur de formulaire, la ligne 170 du fichier jQuery validate non minified.

// 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 joindra au validateur de formulaire. Lorsque vous regardez le code qui effectue la validation, la mise en surbrillance, la mise en surbrillance, 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 $ ("formulaire"). Validate () ne soit appelé.

Si vous utilisez Asp.net MVC et le plugin discret, vous vous rendrez compte qu'après avoir regardé javascript, valider est appelé dans document.ready. J'ai aussi appelé mon setDefaults dans le bloc document.ready qui sera exécuté après les scripts, jquery validate et discret parce que j'ai défini ces scripts dans le code HTML avant celui qui contient l'appel. Donc, mon appel n'a évidemment aucun impact sur la fonctionnalité par défaut consistant à ignorer des éléments cachés lors de la validation. Il y a quelques options ici.

Option 1 - Comme Juan Mellado l'a fait remarquer, vous pourriez avoir l'appel en dehors du document.ready qui serait exécuté dès le chargement du script. Je ne suis pas sûr du moment choisi car les navigateurs sont maintenant capables de charger des scripts en parallèle. Si je suis trop prudent, alors corrigez-moi. En outre, il y a probablement des moyens de contourner cela, mais pour mes besoins, je ne me suis pas engagé dans cette voie.

Option 2a - À mes yeux, le pari le plus sûr est de simplement remplacer la $.validator.setDefaults({ ignore: '' }); à l'intérieur de l'événement document.ready par la $("form").data("validator").settings.ignore = "";. Cela modifiera la propriété ignore 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 utiliser $("form").validate().settings.ignore = ""; pour définir la propriété ignore. La raison en est que lorsque l'on examine la fonction validate, celle-ci vérifie si un objet validateur a déjà été stocké pour l'élément de formulaire via la fonction $.data(). S'il trouve un objet validateur stocké avec l'élément de formulaire, il renvoie simplement l'objet validateur au lieu d'en créer un autre.

26
JustinMichaels

Vient d’ajouter ignore: [] à la page spécifique du formulaire spécifique, cette solution a fonctionné pour moi. 

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

Cela fonctionne pour moi.

jQuery("#form_name").validate().settings.ignore = "";
0
Waqas Bukhary