$("#product_create").validate({ rules: { product_name: { required: true,minlength: 10,maxlength: 50 },product_price: { required: true,number: true,minlength: 2 },product_quantity: { required: true,digits: true,minlength: 1 } },messages: { product_name: { required: "El nombre del producto no se puede dejar vacío",minlength: "El nombre del producto no puede tener menos de 10 carácteres",maxlength: "El nombre del producto no puede tener más de 50 carácteres" },product_price: { required: "Debes introducir un precio",number: "El precio debe ser un número decimal o no" },product_quantity: { required: "Debes introducir una cantidad",number: "La cantidad debe ser un número" } } });
如果我理解良好,那么在keyup事件字段应该验证并且它们不是因为错误没有出现.所以关于这个的第一个问题是:为什么它不验证?我的解决方案有什么问题?第二个是我如何验证product_price和product_quantity它们是否可见?
现在关于同样的话题,我有另一个疑问,我在飞行中创建了几个字段,是的,我每次都知道他们的ID,在这种情况下我是如何将规则应用于这些字段的?
UPDATE
我找出了keyup的问题所在,验证是通过输入名称进行的,而不是输入id,因为我很难,所以这部分完成了.
第二个问题仍未解决.例如,我可以生成三个字段名称变体[pprice] []和苍蝇,但可以是五个或更多或其他,我如何将这些字段添加到规则和验证部分?我可以只添加变体[pprice] []的规则,无论表格中有多少具有相同名称的元素,它都会验证吗?
也正在等待验证字段的部分,只要它们是可见的
更新2
由于变体[pprice] []是一个项目数组,我可以使用$.each来移动它们并分配规则吗?
更新3
根据@Sparky的建议,我将我的代码更改为:
$('#variations_holder input.pprice').each(function() { $(this).rules('add',{ required: true,messages: { required: "Debes introducir un precio de la variación",number: "El precio de la variación debe ser un valor numérico o decimal" } }); });
但在Firebug中我收到此错误:
TypeError: e.validator.methods[o] is undefined
这会阻止脚本的代码执行,在这种情况下我想念的是什么?
更新4
假设我不能使用多个表单,所以我只有一个表单有很多部分(使用section标签),我处理每个表单之间的移动.我试图以相同的形式调用validate()但是两次,并且在第5步验证不起作用,因为字段通过.这是我正在使用的代码:
function validateWizard(step){
var is_valid = true;
switch (step) { case 1: if ($("#selected_category").val() === '' || $("#selected_category").val().length === 0) { alert("Debes seleccionar una categoría antes de continuar"); is_valid = false; } break; case 2: $("#product_create").validate({ rules: { "product[name]": { required: true,maxlength: 50 },"product[price]": { required: true,minlength: 2 },"product[quantity]": { required: true,minlength: 1 },"product[description]": { required: true } },messages: { "product[name]": { required: "El nombre del producto no se puede dejar vacío",maxlength: "El nombre del producto no puede tener más de 50 carácteres" },"product[price]": { required: "Debes introducir un precio",number: "El precio debe ser un valor numérico o decimal" },"product[quantity]": { required: "Debes introducir una cantidad",number: "La cantidad debe ser un número" },"product[description]": { required: "Debes introducir una descripción del producto" } } }); is_valid = $("#product_create").valid(); if (is_valid) { $('#variations_holder input.pprice').each(function() { pprice = $.trim(this.value); if (!pprice.length) { $(this).focus(); $(this).addClass('error'); is_valid = false; } else if (!/^[1-9]\d*(\.\d+)?$/.test(pprice)) { $(this).addClass('error'); is_valid = false; } }); // Validate quantity in variation $('#variations_holder input.pqty').each(function() { pqty = $.trim(this.value); if (!pqty.length) { $(this).focus(); $(this).addClass('error'); is_valid = false; } else if (!/^[1-9]\d*$/.test(pqty)) { $(this).addClass('error'); is_valid = false; } }); } break; case 3: break; case 5: $("#product_create").validate({ rules: { "stock[sku]": { required: true,maxlength: 20 },"stock[width]": { required: true,"stock[height]": { required: true,"stock[length]": { required: true },"stock[weight]": { required: true,"stock[description]": { required: true },"warranty[description]": { required: true },"warranty[valid_time]": { required: true,digits: true } },messages: { "stock[sku]": { required: "El SKU no se puede dejar vacío",minlength: "El SKU no puede tener menos de 10 carácteres",maxlength: "El SKU no puede tener más de 50 carácteres" },"stock[width]": { required: "Debes introducir un ancho",number: "El ancho debe ser un número" },"stock[height]": { required: "Debes introducir una altura",number: "La altura debe ser un número" },"stock[length]": { required: "Debes introducir una longitud",number: "La longitud debe ser un número" },"stock[weight]": { required: "Debes introducir un peso",number: "El peso debe ser un número" },"stock[description]": { required: "Debes introducir una descripción del stock del producto" },"warranty[description]": { required: "Debes introducir una descripción de la garantía para este producto" },"warranty[valid_time]": { required: "Debes introducir un período de validez",digits: "El período de validez no es válido" },} }); is_valid = $("#product_create").valid(); break; } return is_valid;
}
我的问题是为什么如果表格在第5步无效,它会通过?不应该失败吗?
@R_502_323@
“Since
variation[pprice][]
is a array of items,can I use$.each
to move for them and assign rules?”
当jQuery选择器针对多个输入元素时,必须使用.each().但是,这并没有解决jQuery Validate插件要求每个input元素包含唯一name属性的事实.这就是插件跟踪元素的方式. (一组具有相同名称的无线电或复选框元素不是问题,因为当它们被分组时,它们应该具有相同的名称……该组充当单个数据输入.)
这不起作用,因为有多个具有相同名称的输入元素……
$('input[name="something"]').each(function() { $(this).rules('add',function() { required: true,// another rule,etc,}); });
只要每个输入元素包含唯一名称,这将起作用…
$('input.class').each(function() { $(this).rules('add',}); });
有关可以定义和应用规则的各种方法,请参见this answer.
阶梯形式有各种方法.
当我创建多步骤表单时,我使用一组唯一的< form>每个部分的标签.然后我使用the .valid()
method测试该部分,然后再移动到下一部分. (不要忘记首先初始化插件;在DOM准备好的所有表单上调用.validate().)
然后在最后一节,我在每个表单上使用.serialize()并将它们连接成一个要提交的数据查询字符串.
这样的东西……
$(document).ready(function() { $('#form1').validate({ // initialize form 1 // rules }); $('#gotoStep2').on('click',function() { // go to step 2 if ($('#form1').valid()) { // code to reveal step 2 and hide step 1 } }); $('#form2').validate({ // initialize form 2 // rules }); $('#gotoStep3').on('click',function() { // go to step 3 if ($('#form2').valid()) { // code to reveal step 3 and hide step 2 } }); $('#form3').validate({ initialize form 3 // rules,submitHandler: function (form) { // serialize and join data for all forms // ajax submit return false; } }); // there is no third click handler since the plugin takes care of this // with the built-in submitHandler callback function on the last form. });
重要的是要记住我上面的点击处理程序没有使用type =“submit”按钮.这些是常规按钮,可以在表单标签之外,也可以是type =“button”.
只有最后一个表单上的按钮是常规类型=“提交”按钮.那是因为我只在最后一个表单上利用了插件的内置submitHandler回调函数.
“概念证明”演示:http://jsfiddle.net/N9UpD/
另外,请参阅: