具有相同表单名称的Jquery验证

时间:2009-06-25 02:23:41

标签: javascript jquery jquery-validate

我有一个表单可以做两件事:

  1. 将名字和电子邮件地址传递给PHP。
  2. 如果用户想要提交一组或多组数据,请在点击时动态添加一组新的名称/电子邮件字段。
  3. 由于我不确切知道每个用户可以选择提交多少集,我将数据传递给数组中的PHP(使用名称后跟[]),因此我可以使用foreach循环并始终获取每个数据集。以下是一些可以更好理解的代码:

    <form method="post" action="submit.php" id="formID">
    <table width="100%" border="0" cellspacing="0" cellpadding="0" id="contacts">
    <tr>
        <td><label class="namelabel"><span>Friend's First Name:</span><input type="text" name="friendName[]" class="friendName" id="name1" /></label></td>
        <td><label class="emaillabel"><span>Friend's Email:</span><input type="text" name="friendEmail[]" class="friendEmail" id="email1" /></label></td>
    </tr>
    </table>
    <p class="addmore"><a href="#" id="addclick">Click Here To Send This To More Friends</a></p>
    <input type="submit" value="Spread The News!" name="submit" />
        </form>
    <script language="javascript" type="text/javascript" src="include/jquery-1.3.2.min.js"></script>
    <script language="javascript" type="text/javascript" src="include/jquery.validate.pack.js"></script>
    <script type="text/javascript">
        $(document).ready(function() {
            fieldCount = 1;
            $("#addclick").click(function(e){
                e.preventDefault();
                fieldCount+=1;
                $('#contacts tr:last').after('<tr><td><label class="namelabel"><span>Friend\'s First Name:</span><input type="text" name="friendName[]" class="friendName" id="name' + fieldCount + '" /></label></td><td><label class="emaillabel"><span>Friend\'s Email:</span><input type="text" name="friendEmail[]" class="friendEmail" id="email' + fieldCount + '" /></label></td></tr>');
            });
            $("#formID").validate({
    rules: {
        "friendName[]": "required",
        "friendEmail[]": "required email",
      }
    });
            });
        </script>
    

    但问题是,只有第一个friendName []和friendEmail []才会在提交时得到验证。你必须点击任何其他具有相同名称的字段才能使验证工作(就像懒惰的验证只在焦点后开始)

    如何为表单字段使用相同的名称,并同时验证所有这些名称?

3 个答案:

答案 0 :(得分:3)

按照以下步骤操作。

1)打开jquery.validate.js文件
2)找到checkForm:function(){
3)用以下代码替换此功能。

checkForm: function() {
    this.prepareForm();
    for ( var i = 0, elements = (this.currentElements = this.elements()); elements[i]; i++ ) {
        if (this.findByName( elements[i].name ).length != undefined && this.findByName( elements[i].name ).length > 1) {
            for (var cnt = 0; cnt < this.findByName( elements[i].name ).length; cnt++) {
                    this.check( this.findByName( elements[i].name )[cnt] );
            }
        } else {
            this.check( elements[i] );
        }
    }
    return this.valid();
}

答案 1 :(得分:1)

这不起作用,因为每个动态添加的项目都需要一个唯一的名称,请查看关于此确切问题的SO帖子。

Using JQuery Validate Plugin to validate multiple form fields with identical names

答案 2 :(得分:0)

我对JQuery习语有点不稳定。但是,将此回调添加到validate调用中会起作用:

submitHandler: function(form) {
  var els = $('.friendName, .friendEmail');
  for (var i = 0; i < els.length; i++) {
    $(form).validate().element(els[i]);
  }
}

显然,知道JQuery习语(又名hlep1!)的人可以删除对els和循环的分配。

只有在表单有效后才会调用提交处理程序。一旦检查了每个名称的第一个实例,表单就有效。另一种方法是破解/ monkeypatch你的插件删除该检查。

相关问题