I have a form with a stage that has a dynamic number of groups of fields, where the number is based upon answers in the previous stage.
I'm generating the fields server-side as an array, i.e.
<input id="foo[0]"...
<input id="bar[0]"...
<input id="foo[1]"...
<input id="bar[1]"...
<input id="foo[2]"...
<input id="bar[2]"... etc
No matter the number, all fields are required & I also need to validate against type & number of digits in some cases. I'm using the jQuery validate plugin for client-side processing (yes, backed up with server-side stuff too) & the validation can't be done inline as the form needs to pass XHTML Strict (EDIT: see my addendum below).
My problem is that I can't work out how to use validate with a dynamic number of fields. Here's what the validate syntax typically looks like for the rest of the form:
$(document).ready(function() {
// validate stage_form on keyup and submit
var validator = $("#form_id").validate({
// rules for field names
rules: {
name: "required",
address: "required",
age: { required: true, number: true }
},
// inline error messages for fields above
messages: {
name: "Please enter your name",
address: "Please enter your address",
age: { required: "Please enter your age", number: "Please enter a number" }
}
});
});
Here is another way to do this.
No answers so I'll post my "interim" solution, which is to set inline validation rules for 'required' and 'type', leaving 'maxlength' to server-side checking, then display custom messages with an inline title tag.
This is probably good enough for the purposes of this job, but I'm still curious if there's a way to do it 'completely' within jQuery.
actually it should work If you'd use classes instead of initializing rules as validate() options.
Markup:
jQuery:
hope this works. Sinan.
Have you tried to use custom class rules to define the xhtml incompatible rules?
The example in the docs only uses one class, but I suppose you could combine different custom classes to achieve the validation rules you need. I haven't tried this for myself.
I found a way to do using "metadata".
This should be used inside a template with a dynamic name. So, i don't need to know the name.
The downside is still not possible to use the code with pure javascript with clean tags.