jQuery验证工作,但允许使用无效数据提交表单

时间:2012-12-31 13:48:52

标签: jquery regex jquery-validate

我一直在研究这几个小时,并且在我的智慧结束时。我在同一页面上有两个表单,两个表单都使用jQuery验证在提交之前确认有效数据。

编辑:

包括以下代码。

两件事:

  1. 出于某种原因,第一种表格(注册表格)正在验证,因为我正在输入数据。所以看起来它正在触发keyup / blur事件,但是当我点击提交按钮时它没有正常触发。正如您可以清楚地看到的那样,它允许使用空的OR无效数据提交表单。

  2. 右侧的登录表单。有用!但我需要点击提交按钮两次才能实际提交表单。

  3. 这里充满了头发。请有人能帮忙解决这个问题吗?

    编辑:

    根据要求在此处添加代码。首先,注册验证人:

    <script type="text/javascript">
    
    $(document).ready(function() {
    
     $.validator.addMethod("PASSWORD",function(value,element){
            return this.optional(element) || /^(?=.*\d)(?=.*[a-zA-Z]).{5,}$/i.test(value);
            },"Your password must be at least 5 characters long. Please include 1 or more numbers.");
      $.validator.addMethod("lettersnumbers", function(value,element) {
            return this.optional(element) || /^[a-zA-Z0-9]+$/i.test(value);
            }, "Username can only contain letters and numbers. No spaces are allowed.");    
     $.validator.addMethod("BIRTH",function(value,element){
            var age = 18;
    
            switch($('#Province option:selected').val())
            {
                case "NB":
                case "BC":
                case "NL":
                case "NS":
                case "NY":
                case "YT":
                case "NU":
                case "AL":
                case "DE":
                case "NE":
                case "NV":
                case "OH":
                case "TN":
                case "UT":
                case "VA":
                case "WI":
                    age = 19;
                    break;
                case "MS":
                    age = 21;
                    break;      
    
            }
            if (new Date().getFullYear() - year <= age)
            {                                   
                return false;           
            }
            return true;
            },"In order to be eligible to Register, you must have reached the age of majority in your Province, Territory, or County of residence.");
     var validator = $("#signupForm").validate({
            rules: {
                Captcha: {
                    required: true,
                    remote: {
                        url: "/js/validate_captcha.php",
                        type: "post",
                        data: {
                            action: function () {
                                return "checkcaptcha";
                            },
                            username: function() {
                                var Captcha = $("#Captcha").val();
                                return Captcha;
                            }
                        }
                    }               
                },          
                Password: "required PASSWORD",
                PasswordConfirm: {
                    required: true,
                    minlength: 5,
                    equalTo: "#Password"
                },
                Username: {
                    required: true,
                    lettersnumbers: true,
                    maxlength: 18,
                    remote: {
                        url: "/js/validate_username.php",
                        type: "post",
                        data: {
                            action: function () {
                                return "checkusername";
                            },
                            username: function() {
                                var Username = $("#Username").val();
                                return Username;
                            }
                        }
                    }
    
                },
                Country: "required",
                FirstName: "required",
                LastName: "required",
                Email: {
                    required: true,
                    remote: {
                        url: "/js/validate_email.php",
                        type: "post",
                        data: {
                            action: function () {
                                return "checkemail";
                            },
                            username: function() {
                                var Email = $("#Email").val();
                                return Email;
                            }
                        }
                    },
                    email: true
                },
                EmailConfirm: {
                    required: true,
                    email: true,
                    equalTo: "#Email"
                },
                BirthDate: { 
                    required: true,
                    BIRTH: true
                },
                Agreement: "required",
                AgeCheck: "required",
    
            },
            messages: {
                captcha: "CAPTCHA response is required" ,
                Agreement: "You must agree by checking the box" ,
                AgeCheck: "You must agree by checking the box"  ,       
                EmailConfirm: "Email Addresses do not Match",
                lettersnumbers: "Username can only contain letters and numbers. No spaces allowed.",
                noSpace: "Username cannot have spaces",
                PasswordConfirm: "Please re-enter the same password as above",  
                Username:{
                    remote: "This username is already taken. Try another.",
                    maxlength: "Username may not be longer than 18 characters."
                },
                Captcha:{
                    remote: "You have entered an incorrect CAPTCHA response."
                },              
                Email:{
                    remote: "This e-mail is already taken. Try another."
                },          
                Password: {
                    required: "Please provide a password",
                    minlength: "Your password must be at least 5 characters long. Please include 1 or more numbers."            },
                required: "Required Field" ,
            },
        }); 
    
    });
    
    </script>            
    

    现在,登录验证器:

    <script type="text/javascript">
    $(document).ready(function() {
    
       var loginvalidator = $("#form_login").validate({
          rules: {
              LoginUser: {
                  required: true,
                  remote: {
                      url: "/js/validate_login_username.php",
                      type: "post",
                      data: {
                          action: function () {
                              return "checkusername";
                          },
                          username: function() {
                              var Email = $("#LoginUser").val();
                              return Email;
                          }
                      }
                  }             
              },    
    
              LoginPassword: "required"
    
          },
          messages: {               
              LoginUser: {
                  required: "Required Field",
                  remote: "The username or email entered was not found. Please note, your username must contain only letters and numbers, and never any spaces. Try logging in with your email address instead." },
              LoginPassword: {
                  required: "Required Field",
                  remote: "Password is incorrect. Please try again." },
          },
       });  
    });
    </script>
    

1 个答案:

答案 0 :(得分:0)

[以下答案已根据评论进行了编辑]

因为没有特别错误从代码中跳出来:

  • 尝试在每个验证器中启用调试选项{debug:true},以便向控制台输出一些输出以发现问题。

  • 您没有明确要验证哪些事件,请考虑将{onkeydown:false,onfocusout:false,onclick:false}添加到选项哈希中,以便将valiadation限制为仅提交事件

  • 在关闭制表符后,规则哈希中还有一些不必要的尾随逗号。 perhaaps不足以导致错误,但当我遇到意外行为时,我总是想要清除这样的事情。 [注意:@Sparky,这只是旧版本IE中的一个问题。]

PS:原始海报解决了由于使用隐藏字段导致BIRTH功能失败的问题,该字段被浏览器(firefox)静默填充无效数据并导致验证失败。