J'aimerais valider un formulaire à l'aide du plugin jquery validate, mais je ne parviens pas à utiliser la valeur "name" dans le code HTML, car il s'agit d'un champ également utilisé par l'application serveur. Plus précisément, je dois limiter le nombre de cases à cocher d'un groupe. (Maximum de 3.) Tous les exemples que j'ai vus utilisent l'attribut name de chaque élément. Ce que j'aimerais faire, c'est utiliser la classe à la place, puis déclarer une règle pour cela.
html
Cela fonctionne:
<input class="checkBox" type="checkbox" id="i0000zxthy" name="salutation" value="1" />
Cela ne fonctionne pas, mais c'est ce que je vise:
<input class="checkBox" type="checkbox" id="i0000zxthy" name="i0000zxthy" value="1" />
javascript:
var validator = $(".formToValidate").validate({
rules:{
"salutation":{
required:true,
},
"checkBox":{
required:true,
minlength:3 }
}
});
Est-il possible de le faire - existe-t-il un moyen de cibler la classe au lieu du nom dans les options de règles? Ou dois-je ajouter une méthode personnalisée?
Cordialement, Matt
Vous pouvez ajouter les règles basées sur ce sélecteur en utilisant .rules("add", options)
, supprimez simplement les règles de votre choix basées sur vos options de validation, et après avoir appelé $(".formToValidate").validate({... });
, faire ceci:
$(".checkBox").rules("add", {
required:true,
minlength:3
});
Une autre façon de procéder consiste à utiliser addClassRules . C'est spécifique pour les classes, alors que l'option utilisant selector et .rules est plus générique.
Avant d'appeler
$(form).validate()
Utilisez comme ceci:
jQuery.validator.addClassRules('myClassName', {
required: true /*,
other rules */
});
Réf.: http://docs.jquery.com/Plugins/Validation/Validator/addClassRules#namerules
Je préfère cette syntaxe pour un cas comme celui-ci.
Je sais que c'est une vieille question. Mais moi aussi, j’ai eu besoin du même produit récemment, et j’ai eu cette question de stackoverflow + une autre réponse de ce blog. La réponse qui était dans le blog était plus simple car elle se concentre spécialement pour ce type de validation. Voici comment faire.
$.validator.addClassRules("price", {
required: true,
minlength: 2
});
Cette méthode ne vous oblige pas à avoir la méthode validate au-dessus de cet appel.
J'espère que cela aidera aussi quelqu'un dans le futur. Source ici .
Voici la solution utilisant jQuery:
$().ready(function () {
$(".formToValidate").validate();
$(".checkBox").each(function (item) {
$(this).rules("add", {
required: true,
minlength:3
});
});
});
Voici ma solution (ne nécessite pas jQuery ... juste JavaScript):
function argsToArray(args) {
var r = []; for (var i = 0; i < args.length; i++)
r.Push(args[i]);
return r;
}
function bind() {
var initArgs = argsToArray(arguments);
var fx = initArgs.shift();
var tObj = initArgs.shift();
var args = initArgs;
return function() {
return fx.apply(tObj, args.concat(argsToArray(arguments)));
};
}
var salutation = argsToArray(document.getElementsByClassName('salutation'));
salutation.forEach(function(checkbox) {
checkbox.addEventListener('change', bind(function(checkbox, salutation) {
var numChecked = salutation.filter(function(checkbox) { return checkbox.checked; }).length;
if (numChecked >= 4)
checkbox.checked = false;
}, null, checkbox, salutation), false);
});
Mettez ceci dans un bloc de script à la fin de <body>
et le fragment fera son effet magique en limitant le nombre de cases cochées à trois (ou le nombre que vous aurez spécifié).
Ici, je vais même vous donner une page de test (collez-la dans un fichier et essayez-la):
<!DOCTYPE html><html><body>
<input type="checkbox" class="salutation">
<input type="checkbox" class="salutation">
<input type="checkbox" class="salutation">
<input type="checkbox" class="salutation">
<input type="checkbox" class="salutation">
<input type="checkbox" class="salutation">
<input type="checkbox" class="salutation">
<input type="checkbox" class="salutation">
<input type="checkbox" class="salutation">
<input type="checkbox" class="salutation">
<script>
function argsToArray(args) {
var r = []; for (var i = 0; i < args.length; i++)
r.Push(args[i]);
return r;
}
function bind() {
var initArgs = argsToArray(arguments);
var fx = initArgs.shift();
var tObj = initArgs.shift();
var args = initArgs;
return function() {
return fx.apply(tObj, args.concat(argsToArray(arguments)));
};
}
var salutation = argsToArray(document.getElementsByClassName('salutation'));
salutation.forEach(function(checkbox) {
checkbox.addEventListener('change', bind(function(checkbox, salutation) {
var numChecked = salutation.filter(function(checkbox) { return checkbox.checked; }).length;
if (numChecked >= 3)
checkbox.checked = false;
}, null, checkbox, salutation), false);
});
</script></body></html>
Si vous voulez ajouter une méthode personnalisée, vous pouvez le faire
(dans ce cas, au moins une case cochée)
<input class="checkBox" type="checkbox" id="i0000zxthy" name="i0000zxthy" value="1" onclick="test($(this))"/>
en javascript
var tags = 0;
$(document).ready(function() {
$.validator.addMethod('arrayminimo', function(value) {
return tags > 0
}, 'Selezionare almeno un Opzione');
$.validator.addClassRules('check_secondario', {
arrayminimo: true,
});
validaFormRichiesta();
});
function validaFormRichiesta() {
$("#form").validate({
......
});
}
function test(n) {
if (n.prop("checked")) {
tags++;
} else {
tags--;
}
}
Pour moi, certains éléments sont créés au chargement de la page, et d'autres sont ajoutés dynamiquement par l'utilisateur; J'ai utilisé cela pour m'assurer que tout restait au sec.
Sur soumettre, trouvez tout avec la classe x, supprimez la classe x, ajoutez la règle x.
$('#form').on('submit', function(e) {
$('.alphanumeric_dash').each(function() {
var $this = $(this);
$this.removeClass('alphanumeric_dash');
$(this).rules('add', {
alphanumeric_dash: true
});
});
});