2013-04-03 68 views
5

我具有以下形式:jQuery验证与被添加到表单字段动态

<form class="form-validation"> 
    <input name="product[0][name]" id="form_product[0][name]" data-rule-required="true"> 
</form> 

其与jQuery验证插件验证。我这样称呼它:

$(".form-validation").validate(); 

验证按预期工作。然后我有一个按钮,它动态地添加字段到表单,基本上它创建了这个:

<form class="form-validation"> 
    <input name="product[0][name]" id="form_product[0][name]" data-rule-required="true"> 
    <input name="product[1][name]" id="form_product[1][name]" data-rule-required="true"> 
    <input name="product[2][name]" id="form_product[2][name]" data-rule-required="true"> 
    ... 
</form> 

现在,此验证后,行为不再OK了。它仍然验证窗体,但我得到奇怪的结果。有时来自filed3的onsubmit值会移至field2,并且规则也会在字段之间传递...

我想我需要告诉验证程序已添加新字段,但我不知道如何?

+0

哪个插件?问题中提到的“jQuery验证”插件,或标记为“jQuery验证引擎”的?他们是两个不同的东西。 – Sparky

+0

基于代码'.validate()',我更新了你的标签。 – Sparky

+0

** Quote:OP:** _“我得到了奇怪的结果,有时来自filed3的提交值将被移至field2,并且规则也会在各个字段之间传递”_〜请参阅下面我的答案的第二部分。你在第二和第三个字段上重复了'id'。 'id'必须是唯一的,否则就像你所描述的那样,你会得到奇怪的结果。 – Sparky

回答

4

要将规则应用到动态创建的字段,您可以在之后立即调用rules('add') method创建新的输入字段。由于您没有显示添加新字段的任何代码,因此我无法向您显示此技术的精确演示。

然而,由于你的规则已经是HTML属性的一部分,下面这个演示表明,你的代码应该已经做工精细:

http://jsfiddle.net/WVbmj/


报价OP:

它仍然验证窗体,但我得到奇怪的结果。有时,来自filed3的提交 值将移至field2,并且规则也将在 字段之间传递。

这可能是因为你有一个重复idid="form_product[1][name]",在你的第二个&第三input元素。 id必须是唯一的,否则你会得到这样的奇怪结果。像我在上面的演示中那样解决这个问题。

再次,它的工作在这个id问题是固定的:http://jsfiddle.net/WVbmj/

+0

我所有的规则都是在HTML中通过'data-rule'属性定义的,就像你在我的问题中看到的那样。我调用验证'$(“。form-validation”)。validate();'。我曾尝试调用.rules('add'),就像我在打开这个问题之前所建议的那样,但并不适合我... –

+0

@PrimozRome,请阅读我的问题的其余部分。 [这个演示清楚地显示你的代码工作正常](http://jsfiddle.net/WVbmj/),看起来你的整个问题是由第二个和第三个'input'元素上的'id'重复引起的。 – Sparky

+0

这个ID很好,只是一个错字...我已经修好了!我看到你的例子,它真的有用。但是你在哪里叫规则('增加'),你提到。你实际上添加了新的领域的DOM,没有别的......它的工作原理? –

0

您应该为所有字段设置相同的类名称。

例如:

<input class="form-control amount validate_form" name="amount[]" type="text"> 
<p class="validateError" style="color:red;display:none;">please enter amount.</p> 
<button type="submit" id="fees_stream_submit" class="btn btn-primary">Submit</a> 

<script type="text/javascript"> 
      $(document).on('click', '#fees_stream_submit', function(e){ 
       e.preventDefault(); 
       $(".validate_form").each(function() { 
        var selectedTr = $(this); 
        i =0; 
        var value = $(this).val(); 
        if (!value) { 
         selectedTr.next("p").show(); 
         i++; 
        } else { 
         selectedTr.next("p").hide(); 
        } 
       }); 

       if (i == 0) { 
        $('#fees_stream_form').submit(); 
       } 
      }); 
     </script>