Comment valider le tableau des entrées en utilisant le plugin valider jquery
Je suis nouveau dans le plugin de validation de jquery mais je voudrais savoir comment faire pour valider le tableau de boîtes de saisie en utilisant le plugin de validation..
ci-dessous est le code html.
<form id="transport-form">
<input type="text" name="qty[]" id="qty1">
<input type="text" name="qty[]" id="qty2" >
<input type="text" name="qty[]" id="qty3">
<input type="text" name="qty[]" id="qty4">
<input type="submit value="submit">
</form>
et le code jquery est en dessous de
jQuery("#transport-form").validate({
rules: {
'qty[]': {
required: true
}
},
});
mais chaque fois que je clique sur Soumettre, il ne valide que la première valeur. toutes les valeurs du même nom ne sont pas validés. S'il vous plaît aider.
8 réponses
parfois nous avons besoin de valider un tableau d'éléments d'entrée: par exemple –
<form name="signupForm" class="cmxform" id="signupForm" method="get" action="">
<select name="category[]" id="cat_1">
<option value="">Select One</option>
<option value="1">aa</option>
<option value="2">bb</option>
<option value="3">cc</option>
<option value="4">dd</option>
</select>
<select name="category[]" id="cat_2">
<option value="">Select One</option>
<option value="5">ee</option>
<option value="6">ff</option>
<option value="7">gg</option>
<option value="8">hh</option>
</select>
<select name="category[]" id="cat_3">
<option value="">Select One</option>
<option value="9">ii</option>
<option value="10">jj</option>
<option value="11">kk</option>
<option value="12">ll</option>
</select>
<input class="submit" type="submit" value="Submit">
</form>
maintenant nous allons utiliser jQuery validation plugin jquery.valider.js pour valider le formulaire. La condition sera que l'Utilisateur devra choisir la catégorie de chaque dropdown. Le script de validation sera comme ci-dessous -
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="jquery.validate.js"></script>
<script type="text/javascript">
$(document).ready(function() {
// validate the comment form when it is submitted
$("#signupForm").validate({
rules: {
"category[]": "required"
},
messages: {
"category[]": "Please select category",
}
});
});
</script>
maintenant le problème est que le jquery readymade.valider.js ne valide que le premier élément de la catégorie[]. Donc, nous avons besoin de le modifier un peu bit.
à jquery.valider.js, nous pouvons trouver une fonction appelée checkForm, nous devons la modifier comme suit:
checkForm: function() {
this.prepareForm();
for (var i = 0, elements = (this.currentElements = this.elements()); elements[i]; i++) {
if (this.findByName(elements[i].name).length != undefined && this.findByName(elements[i].name).length > 1) {
for (var cnt = 0; cnt < this.findByName(elements[i].name).length; cnt++) {
this.check(this.findByName(elements[i].name)[cnt]);
}
} else {
this.check(elements[i]);
}
}
return this.valid();
}
je viens d'obtenir cette solution http://www.codeboss.in/web-funda/2009/05/27/jquery-validation-for-array-of-input-elements/ j'espère que cela aidera quelqu'un..
Vous pouvez passer une option pour ignorer une partie d'un nom de champ; comme pour les commentaires de messages originaux, il y a beaucoup de cas d'utilisation pour avoir un nom[] nom de style en HTML, en particulier en utilisant PHP.
$("#my-form").validate({
submitHandler: function(form) {
form.submit();
},
ignore: [],
rules: {
'category[]': {
required: true
}
}
});
j'ai remarqué que le jQuery valider plugin-je utiliser seulement détecter le premier élément avec un nom spécifique.
une autre façon de faire valider le plugin jQuery détecte aussi toutes les entrées au-delà de la première pourrait être en rendant les noms uniques. Vous pouvez donc remplacer:
<input type="text" name="qty[]" />
<input type="text" name="qty[]" />
<input type="text" name="qty[]" />
<input type="text" name="qty[]" />
avec:
<input type="text" name="qty[0]" />
<input type="text" name="qty[1]" />
<input type="text" name="qty[2]" />
<input type="text" name="qty[3]" />
C'est la Meilleure solution que j'ai trouvé et je suis actuellement aide dans mon projet:
// Adding rule to each item in qtyi list
jQuery('[id^=qty]').each(function(e) {
jQuery(this).rules('add', {
minlength: 2,
required: true
});
});
vous devez faire l'indexation de chaque élément
ci-dessous est le code html.
<form id="transport-form">
<input type="text" name="qty[0]" id="qty1">
<input type="text" name="qty[1]" id="qty2" >
<input type="text" name="qty[2]" id="qty3">
<input type="text" name="qty[3]" id="qty4">
<input type="submit value="submit">
</form>
et le code jquery est en dessous de
jQuery("#transport-form").validate({
rules: {
'qty[]': {
required: true
}
},
});
tout d'abord, pour jQuery pour distinguer entre les éléments, vous devez avoir un id différent par élément. Cela peut être fait programmatiquement lorsque vous ajoutez les entrées. Ensuite, ce que vous devez faire est de vérifier toutes les entrées avec nom commun à la fois. Pour cela, créez un validateur personnalisé en utilisant la fonction addMethod () comme décrit dans la documentation
jQuery.validator.addMethod("allRequired", function(value, elem){
// Use the name to get all the inputs and verify them
var name = elem.name;
return $('input[name="'+name+'"]').map(function(i,obj){return $(obj).val();}).get().every(function(v){ return v; });
});
vous pouvez utiliser cette règle sur votre tableau elements :
$('form').validate(
{
rules: {
"nbPieces[]": "allRequired"
},
submitHandler : function(form, event) {
event.preventDefault();
//... etc
}
});
Pour les erreurs apparaissent correctement sur les champs vides cependant, vous pouvez avoir besoin de surcharger l'option errorPlacement de validate...
Voici la solution sans donner d'indexation à array.
<form>
<div>Name:
<p>
<input name="name_ct[]" id="id_ct0" type="text" class="form-control" placeholder="Add Variant 1 Name">
</p>
</div>
<input type="button" value="Add Variant" />
<input type="submit" />
</form>
Code js
$(document).ready(function () {
$.validator.addMethod("mytst", function (value, element) {
var flag = true;
$("[name^=name_ct]").each(function (i, j) {
$(this).parent('p').find('label.error').remove();
$(this).parent('p').find('label.error').remove();
if ($.trim($(this).val()) == '') {
flag = false;
$(this).parent('p').append('<label id="id_ct'+i+'-error" class="error">This field is required.</label>');
}
});
return flag;
}, "");
$("form").validate({
ignore: '',
rules: {
"name_ct[]": {
mytst:true
}
},
submitHandler: function () {
//you can add code here to recombine the variants into one value if you like, before doing a $.post
form.submit();
alert('successful submit');
return false;
}
});
var j = 1;
$('input[type="button"]').click(function () {
$('form div').append('<p><input name="name_ct[]" id="id_ct' + j + '" type="text" class="form-control" placeholder="Add Variant ' + j + ' Name " ></p>');
j++;
});
});
vous pouvez voir ici dans JS fiddle: https://jsfiddle.net/q0d76aqx/42/
jQuery form Validator est un plugin jQuery riche et multilingue qui permet de valider facilement les entrées de l'utilisateur tout en gardant votre balisage HTML propre à partir du code javascript. Même si ce plugin dispose d'une large gamme de fonctions de validation, il est conçu pour nécessiter le moins de trafic réseau jQuery possible. Pour ce faire, on regroupe les fonctions de validation en "modules", ce qui permet de ne charger que les fonctions nécessaires à la validation d'un forme.
<form action="" id="registration-form">
<p>
E-mail
<input name="email" data-validation="email">
</p>
<p>
User name
<input name="user" data-validation="length alphanumeric"
data-validation-length="3-12"
data-validation-error-msg="User name has to be an alphanumeric value (3-12 chars)">
</p>
<p>
Password
<input name="pass_confirmation" data-validation="strength"
data-validation-strength="2">
</p>
<p>
Repeat password
<input name="pass" data-validation="confirmation">
</p>
<p>
Birth date
<input name="birth" data-validation="birthdate"
data-validation-help="yyyy-mm-dd">
</p>
<p>
Country
<input name="country" id="country" data-validation="country">
</p>
<p>
Profile image
<input name="image" type="file" data-validation="mime size required"
data-validation-allowing="jpg, png"
data-validation-max-size="300kb"
data-validation-error-msg-required="No image selected">
</p>
<p>
User Presentation (<span id="pres-max-length">100</span> characters left)
<textarea name="presentation" id="presentation"></textarea>
</p>
<p>
<input type="checkbox" data-validation="required"
data-validation-error-msg="You have to agree to our terms">
I agree to the <a href="..." target="_blank">terms of service</a>
</p>
<p>
<input type="submit" value="Validate">
<input type="reset" value="Reset form">
</p>
</form>
<script src="//ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script>
<script src="//cdnjs.cloudflare.com/ajax/libs/jquery-form-validator/2.3.26/jquery.form-validator.min.js"></script>
<script>
$.validate({
modules : 'location, date, security, file',
onModulesLoaded : function() {
$('#country').suggestCountry();
}
});
// Restrict presentation length
$('#presentation').restrictLength( $('#pres-max-length') );
</script>
...