0

我目前正在使用 jQuery 验证插件来验证我网站中使用的表单。但是,有多种形式的可能性,我正在使用一种适合所有验证脚本,该脚本应该针对具有特定类的 div 中的所有表单。

目前我的验证如下:

    $(document).ready(function(){
      jQuery.validator.addClassRules({
        isemail: {
          required: true,
          email: true
        }
      });

      jQuery.validator.addMethod("ContainsAtLeastOneDigit", function (value) { return /[a-z].*[0-9]|[0-9].*[a-z]/i.test(value); }, 'Your password must contain at least 1 number');

      $(".icams_inserted form").validate({
        errorClass : "invalid",
        validClass : "valid",
        showErrors: function(errorMap, errorList) {
           var err = this.numberOfInvalids();
           if (err > 1) {
             var word = "errors";
             var field = "fields";
             $("#error_message").html("The form contains " + this.numberOfInvalids() +" "+ word + ". Please correct the highlighted " + field + " below."); this.defaultShowErrors();
             }else{
                var word = "error";
                var field ="field";
                if (err < 1) {
                   $("#error_message").html("");
                   this.defaultShowErrors();
                }else{
                   $("#error_message").html("The form contains " + this.numberOfInvalids() +" "+ word + ". Please correct the highlighted " + field + " below."); this.defaultShowErrors();
                }
             }
       },
       submitHandler: function(form){           
            /*For the registration form, move the email address the user has entered into the hidden email field*/
            if (form.hasClass('prefs')) {
                var mail = $('#p_username').val();
                $('input[type="hidden"][name="p_email_address"]').val(mail);
            }
            form.submit();
       },
       rules : {
           p_password:{
               minlength: 8,
               ContainsAtLeastOneDigit: true
           },
           p_password_conf:{
               equalTo: p_password,
               minlength: 8,
               ContainsAtLeastOneDigit: true
           }
       },
       messages:{
          p_password_conf:{
              equalTo: 'The passwords entered do not match'
          }
       }
    });
  })

但是,出于某种原因,验证似乎会在每个页面上启动,即使是没有任何表单的页面。这会在 Firebug 中产生以下错误:

   ReferenceError: p_password is not defined
   equalTo: p_password,

有人知道为什么吗?我的理解是,插件应该只触发它所针对的元素,在这种情况下,表单包含在具有 .icams_inserted 类的元素中,但情况似乎并非如此。我的理解也是,只有在找到相关元素时才应进行验证。在这种情况下,页面上没有名称为 p_password 的元素,因此不应触发验证脚本。我真的不知道为什么会这样做。

我什至尝试过使用整个站点中不存在的虚拟类,但无论如何验证似乎仍在触发。任何帮助将不胜感激。

4

1 回答 1

1

修改:

你的错误...

ReferenceError: p_password is not defined
equalTo: p_password,

...如上所述,是由您不正确的规则声明引起的...

equalTo: p_password // <-- missing quotes

应该是这样的...

equalTo: "#p_password" // <-- targeted by id in this example

根据 docs,该equalTo值是另一个字段的“选择器”,并用引号括起来。

equalTo编辑:通过 jsFiddle,即使值周围没有引号,我也能看到规则工作。

当页面加载时,调用中的代码正在被解析,并且只要该字段不存在.validate()就会触发错误。p_password“验证”没有触发。



原文如下:


引用问题标题

“无论表单是否存在,jQuery Validate 函数都会在每个页面上触发”

“验证”没有触发。该.validate()调用是插件的初始化方法。


引用操作

“验证似乎在每一页都开始了,即使是没有任何表格的页面。”

除非附加表单触发了事件,否则“验证”不会启动。当您简单地附加.validate()到表单时,您只是在该表单上初始化插件。

$('#myform').validate()≠“验证”

然而,

$('#myform').validate()=在表单上初始化验证插件id="myform"


引用 OP 的评论

“错了。文档在这里明确指出,以这种方式调用 validate 应该只验证指定的表单。”

是的,“验证”只会出现在指定的表格上。但是,调用.validate()与“验证开始”不同。调用该方法只是初始化验证插件。.validate()

“验证”只会由插件捕获的事件之一触发,例如“key up”、“on blur”或“on click of the submit button”。“验证”不会通过简单地加载页面来发生......除非您通过测试方法以编程方式触发它,例如.valid().

于 2013-10-31T13:56:14.617 回答