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

时间:2013-10-31 11:14:50

标签: jquery jquery-validate

我目前正在使用jQuery validate插件来验证我的网站中使用的表单。但是,有多种形式可能性,我正在使用一个适合所有验证脚本,它应该针对具有特定类的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的元素,因此不应触发验证脚本。我真的不知道为什么会这样做。

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

1 个答案:

答案 0 :(得分:1)

<强>修:

您的错误......

ReferenceError: p_password is not defined
equalTo: p_password,

...如上所述,是由您的错误规则声明造成的......

equalTo: p_password // <-- missing quotes

一定是这样......

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

As per docsequalTo值是另一个字段的“选择器”,它被引号括起来。

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

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



原文如下:


引用问题标题

  无论表单是否存在,

“jQuery Validate函数都会在每个页面上触发”

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


引用OP

  

“验证似乎在每个页面上都有用,甚至是没有任何表格的页面。”

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

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

然而,

使用$('#myform').validate()

的表单上的验证插件的

id="myform" = 初始化


引用OP的评论

  

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

是的,“验证”只会发生在指定的表单上。但是,调用.validate() “验证”相同。调用.validate()方法只是初始化验证插件的内容。

“验证”只会由插件捕获的其中一个事件触发,例如“按键”,“模糊”或“点击提交按钮”。只需加载页面,“验证”就会 ...除非您通过测试方法以编程方式触发它,例如.valid()

相关问题