【问题标题】:jQuery Validate function fires on every page regardless of whether form exists无论表单是否存在,jQuery Validate 函数都会在每个页面上触发
【发布时间】:2013-10-31 11:14:49
【问题描述】:

我目前正在使用 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 的元素,因此不应触发验证脚本。我真的不知道为什么要这样做。

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

【问题讨论】:

  • 请显示相关的 HTML 标记来证明您的问题。

标签: jquery jquery-validate


【解决方案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() 方法只是初始化验证插件。

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

【讨论】:

  • 错了。文档在这里明确指出,以这种方式调用 validate 应该只验证指定的表单。 jqueryvalidation.org/validate
  • @jezzpin,您的页面上没有表单!您希望如何在不存在的表单上初始化插件?
  • 你怎么知道我的页面是什么样的?我什至没有放链接。我的表格在 .icams_inserted div 中。我直接针对表单元素,这意味着该 div 中的任何表单都将被验证。
  • Javascript 会抱怨p_password,不管你的类是否存在。这只是浏览器中的基本解析,与Validate无关。
  • @jezzipin,无论如何,您收到此错误是因为您引用了不存在的东西 (p_password)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-14
  • 1970-01-01
  • 2019-12-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多