【问题标题】:jQuery validation is not working during button clickjQuery 验证在按钮单击期间不起作用
【发布时间】:2013-10-22 07:01:27
【问题描述】:

我有一个简单的页面,其中包含一个表单和一个表单外的按钮。我正在尝试验证按钮单击时的表单。我在 document.onready 函数中添加了表单验证规则。但是,该表格未得到验证。

HTML

<form id="form1" method="post" action="">
  <div>
    <input name="Name" id="name1" data-errorclass="error-name"/>
  </div>
  <input type="submit" id="name_id" value="Save"/>
</form>

JS

$(document).ready(function () {
   $("#name_id").click(function() {
     alert("called");
     $('.form1').validate({
       rules: {
        'Name' : {
            required: true
         }

       },
       messages: {
        'Name' : {
            required: 'Name is  required'
         }
       },
       errorClass: 'error-name',
       errorPlacement: function(err, element) {
        err.insertBefore(element);
        },        
     });
   });
});

fiddle

【问题讨论】:

  • 你试过 $('#form1').submit(function() {....});
  • 而不是$("#name_id").click(function() {
  • 通过修复问题中的代码,答案不再有意义。我将其回滚,以便读者能够理解为什么接受的答案有效。

标签: jquery forms jquery-validate


【解决方案1】:

如前所述,原始代码针对class.form1,而实际表单包含id="form1"。将选择器修复为以id 为目标将很快解决此问题。

$('#form1`).validate({...

尽管已经发布了答案,但我觉得还需要发布一些重要说明,以说明有关此插件的一些常见误解。

.validate() 方法仅用于插件初始化,不是测试有效性的方法。所以将.validate() 放在click 处理程序中是没有意义的。 .validate()只需要调用一次,每次点击都重复调用是多余的,没有必要的。

只要提交按钮在&lt;form&gt; 标签内,就不需要click 处理程序,因为这是由插件自动捕获的。见:http://jsfiddle.net/B5mVh/6/

如果按钮在&lt;form&gt; 之外,您可以使用.valid() 方法测试表单的有效性。

$(document).ready(function () {

    $('#form1').validate({  // <-- INITIALIZE plugin on your form
        // your rules & options      
    });

    // For button OUTSIDE of form tags
    $("#name_id").click(function() {
        if ($('#form1').valid()) {
            alert("form is valid");
        } else {
            alert("form is invalid");
        }
    });

});

演示:http://jsfiddle.net/B5mVh/4/

但是,在您的原始代码中,按钮在表单内部,因此如前所述,根本不需要click 处理程序。但是,如果您想在 click 事件上运行一些代码,请使用 submitHandler(有效时)和 invalidHandler(无效时)回调函数。

$(document).ready(function () {

    $('#form1').validate({  // <-- INITIALIZE plugin on your form
        // your rules & options,
        submitHandler: function(form) {
             alert("form is valid");
             return false;
        },
        invalidHandler: function() {
            alert("form is invalid");
        }
    });

});

演示:http://jsfiddle.net/B5mVh/5/

当然,您不必使用这些可选的回调函数。该插件在没有它们的情况下工作得很好,如前所示:

演示:http://jsfiddle.net/B5mVh/6/

【讨论】:

  • 感谢您的澄清。我可以指出jqueryvalidation.org/validate 的文档很糟糕。它说“验证 - 验证选定的表格”。哦!严重地?这是错误的,或者充其量是没有意义的。它应该说的是“验证 - 将一个事件处理程序附加到表单,以便在以后按下提交按钮时对其进行验证。”
  • @JohnHenckel,这也不准确,因为.validate() 方法做得更多,除了点击提交按钮之外,其他事件会自动触发验证。你知道这个 free 插件的文档可以在 GitHub 上找到。换句话说,您可以将您的贡献、建议、补充或更正提交给开发者,而不是抱怨。
  • @Sparky,我可以,但你为什么不这样做呢?我打赌你会比我做得更好。只需将您答案中的几句话复制粘贴到我发布的链接即可。再次感谢。
  • @JohnHenckel,谢谢...我过去对文档做了一些小的改进。但是,为了将来参考,the SO Tag Wiki page is also very informative.
【解决方案2】:

在 jQuery 的 validate() 函数中,您在具有类 .form1 的表单上调用它,您应该将其正确命名为相应的 ID #form1

这应该可以解决您的问题。

【讨论】:

  • @Sidney Liebrand - 不,这是不可能的。如果我这样添加会影响其他功能。
  • ID's 和classes 一起工作总是有点混乱,这也是我经常发生的一个常见错误:)
  • 山姆:这怎么可能?你的目标是一个不存在的类
  • 一个 ID 应该是唯一的,如果您有多个相同的 ID,您应该将其更改为一个类,否则将您的 ID 重命名为唯一的。
  • @BarryChapman,他提到它会通过使用该 ID 影响多个项目,因此我在上面提到了,他会建议将他的 ID 更改为独特的东西
猜你喜欢
  • 1970-01-01
  • 2020-04-12
  • 2017-07-21
  • 1970-01-01
  • 1970-01-01
  • 2018-05-02
  • 1970-01-01
  • 1970-01-01
  • 2013-12-27
相关资源
最近更新 更多