【问题标题】:jQuery validate with a dynamic number of fieldsjQuery 使用动态数量的字段进行验证
【发布时间】:2010-11-04 11:46:57
【问题描述】:

我有一个具有动态数量的字段组的阶段的表单,其中数字基于前一阶段的答案。

我在服务器端将字段生成为数组,即

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

        }

    });

});

【问题讨论】:

    标签: jquery dynamic field validation


    【解决方案1】:

    没有答案,所以我将发布我的“临时”解决方案,即为“必需”和“类型”设置内联验证规则,将“最大长度”留给服务器端检查,然后显示带有内联标题的自定义消息标签。

    这对于这项工作来说可能已经足够了,但我仍然很好奇是否有办法在 jQuery 中“完全”完成它。

    【讨论】:

      【解决方案2】:

      你试过用custom class rules来定义xhtml不兼容的规则吗?

      docs 中的例子只使用了一个类,但我想你可以结合不同的自定义类来实现你需要的验证规则。我自己没试过。

      【讨论】:

        【解决方案3】:

        如果您使用类而不是将规则初始化为 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" 
                    }
        
            }
        
          });
        
        });
        

        希望这行得通。 思南。

        【讨论】:

        • 这就是我最终所做的。请参阅我的自我回答。
        • 实际上我会接受你的回答,这样问题就结束了。干杯。
        • 这使得 :rules 参数毫无用处,代码也变得不那么有条理。 html 中的规则和 javascript sn-p 中的消息错误。不幸的是,独特的选择。
        • 这样做的一个缺点是使用类很难使用更复杂的规则(例如depends)。
        • 查看我的答案,了解没有任何这些缺点的替代方法。
        【解决方案4】:

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

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

        缺点仍然无法使用带有干净标签的纯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"); 
        });
        

        【讨论】:

          【解决方案5】:

          这是另一种方法。

          /* 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;
                  } 
              }
          });
          

          【讨论】:

          • 这样做的一个缺点是它不会与任何已定义的规则同时运行。因此,除非您将所有规则移至 submitHandler,否则您的用户将获得两阶段验证。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2015-02-24
          • 1970-01-01
          • 2020-11-09
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-04-03
          相关资源
          最近更新 更多