2009-06-20 76 views
13

我有一个表单,它有一个动态数量的字段组,其中数字基于上一阶段的答案。jQuery使用动态数量的字段进行验证

我生成字段服务器侧为阵列,即

<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 

不管数量,所有字段都需要&我还需要验证对型在一些情况下&的位数。我使用jQuery validate plugin进行客户端处理(是的,也用服务器端的东西备份)&由于表单需要通过XHTML Strict(编辑:请参阅下面的附录),验证无法内联完成。

我的问题是,我不能解决如何使用动态数量的字段验证。下面介绍一下验证语法通常如下所示的表格的其余部分:

$(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" } 

     } 

    }); 

}); 

回答

13

实际上它应该工作如果您将使用类而不是初始化规则作为validate()选项。

标记:

<input id="foo[0]" class="required" 
<input id="bar[0]" class="required number" 

<input id="foo[1]" class="required" 
<input id="bar[1]" class="required email" 

的jQuery:

$(document).ready(function() { 

    var validator = $("#form_id").validate({ 
    messages: { 
      name: "Please enter your name", 
      address: "Please enter your address", 
      age: { 
       required: "Please enter your age", 
       number: "Please enter a number" 
      } 

    } 

    }); 

}); 

希望这个作品。 思南。

+0

这就是我最终做的。看到我的自我回答。 – da5id 2009-09-06 20:56:33

+0

而实际上我会接受你的回答,这样问题就会被解决。干杯。 – da5id 2009-09-06 20:57:17

0

没有答案,所以我会后我的“临时”的解决方案,这是设置为“必要”和“类型”在线验证规则,将'maxlength'留给服务器端检查,然后用内联标题标签显示自定义消息。

这对于这份工作来说可能够用了,但我仍然好奇是否有办法在jQuery中“完全”做到这一点。

2

您是否尝试过使用custom class rules来定义xhtml不兼容规则?

docs中的示例仅使用一个类,但我想您可以组合不同的自定义类来实现所需的验证规则。我没有为自己尝试过。

-2

我找到了一种使用“元数据”的方法。

这应该在具有动态名称的模板中使用。所以,我不需要知道这个名字。

缺点是仍然不可能使用带纯净标签的纯JavaScript代码。

<script src="jquery.metadata.js" type="text/javascript"></script> 

<input validate="{required: true, email: true, messages: { required: 'i'm required', 'i'm not valid e-mail' }}" name="dynamicRow[ myRandomNumber ]"type="text" class="input_normal" /> 

$(function() { 
    // setup stuff 
    $.metadata.setType("attr", "validate"); 
}); 
0

这是另一种方法。

/* Normal validate initialisation. */ 
$('#myForm').validate({ 

    /* Use the submitHandler method to add custom-selector-based validation. */ 
    submitHandler: function(form, ev) { 

     /* Find your dynamic field/s. Note that you may want to access them via a scope external to validate, as any selection you do in this internal scope will be static from the form's pre-edit state. */ 
     var el = $('#selector'); 

     /* Do your custom validation. */ 
     if ( el.val() !== 'A' ) { 

      /* Show any errors:- 'fieldname': 'error message'. */ 
      this.showErrors({ 
       'name-of-a-field-near-where-you-want-your-error-placed': 'Please enter "A" to continue' 
      }); 

      /* Prevent form submission. */ 
      return; 
     } 
    } 
});