【问题标题】:Jquery.validate - one Page - multiple forms, one submits ok, others dontJquery.validate - 一页 - 多个表单,一个提交,其他不
【发布时间】:2026-02-22 23:30:01
【问题描述】:

在我的页面上,我有 3 个完整的表单,每个表单都有自己的提交按钮,每个表单和按钮都有不同的 id。

<form action="" method="post" class="form-horizontal" id="formA">
   ...
   <button id="formASend" type="submit" class="btn"> Submit</button>
</form>

<form action="" method="post" class="form-horizontal" id="formB">
   ...
   <button id="formBSend" type="submit" class="btn"> Submit</button>
</form>

<form action="" method="post" class="form-horizontal" id="formC">
   ...
   <button id="formCSend" type="submit" class="btn"> Submit</button>
</form>

在 javascript 中,每个提交按钮都有以下逻辑:

$.validator.setDefaults({
        debug:true,
        errorElement: 'span', //default input error message container
        errorClass: 'help-inline', // default input error message class
        focusInvalid: false, // do not focus the last invalid input)
        highlight: function (element) { // hightlight error inputs
            $(element).closest('.control-group').addClass('error'); // set error class to the control group
        },

        unhighlight: function (element) { // revert the change dony by hightlight
            $(element)
                .closest('.control-group').removeClass('error'); // set error class to the control group
        }

    });


$(function() {

    var formA = $('#formA');

    // init validator obj and set the rules
    formA.validate({
        rules: {
             ...
        }
    });

    formA.submit(function () {
        return formA.valid();
    });


    var formB = $('#formB');

    // init validator obj and set the rules
    formB.validate({
        rules: {
            ...
        }
    });

    formB.submit(function () {
        return formB.valid();
    });

    var formC = $('#formC');

    // init validator obj and set the rules
    formC.validate({
        rules: {
            ...
        }
    });

    formC.submit(function () {
        return formC.valid();
    });
});

第一个表格提交工作正常,而其他两个则无效。我用DOMLint检查了html索引,没有问题。点击事件被触发,表单有效,提交返回true,但不提交。

验证工作正常,仅验证提交的表单。

如何对每个表单应用不同的规则?

可能的解决方案

$.validator.setDefaults({
            debug:true,
            errorElement: 'span', //default input error message container
            errorClass: 'help-inline', // default input error message class
            focusInvalid: false, // do not focus the last invalid input)
            highlight: function (element) { // hightlight error inputs
                $(element).closest('.control-group').addClass('error'); // set error class to the control group
            },

            unhighlight: function (element) { // revert the change dony by hightlight
                $(element)
                    .closest('.control-group').removeClass('error'); // set error class to the control group
            },
            submitHandler: function (form) {

               if ($(form).valid()) {
                   form.submit();
               }
            }
        });


    $(function() {

        var formA = $('#formA');

        // init validator obj and set the rules
        formA.validate({
            rules: {
                 ...
            }
        });

        var formB = $('#formB');

        // init validator obj and set the rules
        formB.validate({
            rules: {
                ...
            }
        });

        var formC = $('#formC');

        // init validator obj and set the rules
        formC.validate({
            rules: {
                ...
            }
        });
    });

添加提交处理程序,返回提交事件。

【问题讨论】:

  • 您有 3 个.click()s?还是上面那个^?
  • 你也可以分享其他处理程序的代码吗?
  • @dunli 3 .click()s,是的。删除它们也没有帮助。删除提交处理程序也没有帮助。
  • 引用 OP: “点击事件被触发,表单有效,提交返回 true,但不提交。” ~ 你刚才描述了正是debug:true 选项supposed 要做的事情。去掉它。另请参阅我对其他指针的回答。

标签: jquery forms jquery-validate


【解决方案1】:

引用 OP:

点击事件被触发,表单有效,提交返回true,但是 不提交

debug: true 选项将阻止实际的 submit... 这就是它的用途。 As per documentation,

调试
启用调试模式。 如果为 true,则表单未提交并且控制台上会显示某些错误(需要 Firebug 或 Firebug lite)。

删除debug 选项后,您的代码运行良好:http://jsfiddle.net/9WrSH/1/


引用 OP:

如何对每个表单应用不同的规则?

只需在每个表单的 .validate() 函数中声明您的不同规则即可。

$('#myform1').validate({
    rules: {
        myfield1: {
            required: true,
            minlength: 3
        },
        myfield2: {
            required: true,
            email: true
        }
    }
});

请参阅:http://jsfiddle.net/9WrSH/1/


您不需要这些:

formA.submit(function () {
    return formA.valid();
});

插件已经在捕获submit按钮并自动检查表单,因此无需外部处理事件。


您不需要条件检查或submitHandler 内的submit()

submitHandler: function (form) {
//    if ($(form).valid()) {
//        form.submit();
//    }
}
  • 插件仅在有效表单上触发submitHandler回调,因此无需检查有效性。

  • 该插件还会在表单有效时自动提交表单,因此完全不需要调用.submit()

这些都是多余的和多余的。

【讨论】:

  • 非常感谢您提供如此完整且解释清楚的答案:)
【解决方案2】:

您不需要处理提交事件。无效的表单将不会提交。或者这样做:

//$('#formASend').click(function () {
    formA.submit(function () {

        return formA.valid();
    });
//});

外部点击事件处理程序。你不需要这个:$('#formASend').click(function () {}); 我建议这样做:

var formA = $('#formA');
formA.validate({...});
// no need for these lines:
//$('#formASend').click(function () {
//    formA.submit(function () {

//        return formA.valid();
//    });
//});

【讨论】:

  • 按照您的建议,我将所有提交功能移到了点击事件之外,但它确实有效。第一个仍然会被提交,而其他的则不会。
  • 并删除所有提交处理程序,具有相同的效果。不幸的是,我没有 jsfiddle 帐户,也不知道如何使用它。需要我几秒钟才能弄清楚,大声笑
  • 不需要创建账号。只需编写代码,包括 jQuery 并单击保存并在此处写入 url。我不着急:))
  • 对不起,karaxuna,我没有时间 atm 尝试将我的真实代码放入小提琴并使其工作/显示我得到的行为。这是一个长模板。我在这里发布的伪代码很好地代表了我所拥有的想法。有些东西阻止了提交事件的发生,我的 IDE 没有显示任何语法错误,页面没有 DOMLint 错误。除了摆弄 js fiddle atm 之外,我很感激任何想法。再次道歉。
  • @Neara 我写过fiddle,可以用,看看吧:jsfiddle.net/MLUwf
【解决方案3】:

100% 致力于验证多个表单:

<script src="//code.jquery.com/jquery-1.12.0.min.js"></script>

<script type="text/javascript">
  $(document).ready(function () {
    $("form").submit(function () {

      var clikedForm = $(this); // Select Form

      if (clikedForm.find("[name='mobile_no']").val() == '') {
        alert('Enter Valid mobile number');
        return false;
      }
      if (clikedForm.find("[name='email_id']").val() == '') {
        alert('Enter valid email id');
        return false;
      }

    });
  });
</script>

我在一个页面中有 5 个表单。

【讨论】:

    【解决方案4】:

    我使用多种表单,不需要声明表单的所有字段。只需将class="required" 用于您需要的字段。

    <script type="text/javascript" src="http://ajax.aspnetcdn.com/ajax/jquery.validate/1.11.1/jquery.validate.js"></script>
    <script src='https://ajax.googleapis.com/ajax/libs/jquery/1.8.2/jquery.min.js' type='text/javascript'></script>
    
        <form action="" method="post" class="form-horizontal"<span style="color: blue;"> id="formA"</span>><br />
        <input type="text" name="name1" <span style="color: red;">class="required"</span> /><br />
        <button id="formASend" type="submit" class="btn">Submit</button><br />
        </form><br />
        <form action="" method="post" class="form-horizontal"<span style="color: blue;"> id="formB"</span>><br />
        <input type="text" name="name2"<span style="color: red;"> class="required"</span> /><br />
        <button id="formBSend" type="submit" class="btn">Submit</button><br />
        </form><br />
        <form action="" method="post" class="form-horizontal"<span style="color: blue;"> id="formC"</span>><br />
        <input type="text" name="name3"<span style="color: red;"> class="required"</span> /><br />
        <button id="formCSend" type="submit" class="btn">Submit</button><br />
    </form>
    

    和javascript

    $(document).ready(function () {
                $.validator.addClassRules('required', {
                    required: true
                });
                $('#formA').validate();
                $('#formB').validate();
                $('#formC').validate();
    });
    

    见:demo

    【讨论】:

      最近更新 更多