代码之家  ›  专栏  ›  技术社区  ›  Bullines

jQuery验证:动态更改规则

  •  45
  • Bullines  · 技术社区  · 15 年前

    我有一个表单,根据单击的单选按钮(登录或注册),显示:

    • 密码

    或:

    • 名称
    • 电子邮件地址
    • 密码

    <form id="myForm">
        <input name="userAction" type="radio" value="login" checked="checked">Login</input>
        <br />
        <input name="userAction" type="radio" value="signup">Sign Up</input>
    
        <div id="loginFields" style="display:none">
            <!-- Login fields (email address and password) -->
        </div>
    
        <div id="signupFields" style="display:none">
            <!-- Signup fields (name, age, email address, password) -->
        </div>
    </form>
    

    我用的是 jQuery Validation plug-in ,我想使用以下规则:

    var signupRules = {
        emailAddressTextBox:
        {
            required: true,
            email: true 
        },
        passwordTextBox:
        {
            required: true,
            minlength: 6,
            maxlength: 24,
            passwordValidationRule: true // custom regex added with $.validator.addMethod()
        }
    };
    
    var loginRules = {
        nameTextBox:
        {
            required: true,
            maxlength: 50
        },
        loginEmailAddressTextBox:
        {
            required: true,
            email: true 
        },
        loginPasswordTextBox:
        {
            required: true,
            minlength: 6,
            maxlength: 24,
            passwordValidationRule: true // custom regex added with $.validator.addMethod()
        },
        loginPasswordAgainTextBox:
        {
            required: true,
            minlength: 6,
            maxlength: 24,
            equalTo: "#loginPasswordTextBox"
            passwordValidationRule: true // custom regex added with $.validator.addMethod()        
        }
    };
    

    如何根据以下条件动态添加正确的验证规则:

       $("input[name='userAction']").change(function() {
            if ($("input[name='userAction']:checked" ).val() === "login") {
                // use loginRules
            } else {
                // use signupRules
            }
        });
    

    我试过以下方法:

    $("#myForm").validate({
        rules: ($("input[name='userAction']:checked" ).val() === "login") ? loginRules : signupRules;
    });
    

    10 回复  |  直到 15 年前
        1
  •  55
  •   Ryley    14 年前

    啊,验证插件,总是那么棘手:(

    $("input[name='userAction']").change(function() {
        $('#signupFields').toggle();
        $('#loginFields').toggle();    
        if ($("input[name='userAction']:checked").val() === "login") {
            removeRules(signupRules);
            addRules(loginRules);
        } else {        
            removeRules(loginRules);
            addRules(signupRules);
    
        }
    });
    

    添加和删除函数如下所示:

    function addRules(rulesObj){
        for (var item in rulesObj){
           $('#'+item).rules('add',rulesObj[item]);  
        } 
    }
    
    function removeRules(rulesObj){
        for (var item in rulesObj){
           $('#'+item).rules('remove');  
        } 
    }
    

    差不多了。有关工作示例,请参见此处: http://jsfiddle.net/ryleyb/wHpus/66/

    编辑 形式 你打电话之后 validate

        2
  •  35
  •   robert    11 年前

    或者你可以使用 取决于

    http://jqueryvalidation.org/category/plugin/ 搜索依赖项

    示例:根据需要和电子邮件地址指定联系人元素,后者取决于通过电子邮件选中联系人复选框。

    $(".selector").validate({
      rules: {
        contact: {
          required: true,
          email: {
            depends: function(element) {
              return $("#contactform_email:checked")
            }
          }
        }
      }
    });
    
        3
  •  9
  •   Boban Stojanovski    13 年前

    呼叫

    $('#formid').removeData('validator')
    

    这将删除表单的验证,然后使用新设置重新初始化它

        4
  •  9
  •   FlavioEscobar    10 年前

    一些例子:

    1. 打印附加到的所有规则 #myField : console.log($('#myField').rules());

    2. 删除不需要的规则: $('#myField').rules('remove', 'min');

    3. 添加新规则: $('myField').rules('add', {min: 10});

    remove 以及 add 刚好在…之后:

    // Something happened. The minimum value should now be 100
    $('#myField').rules('remove', 'min');
    $('#myField').rules('add', {min: 100});
    

    https://jqueryvalidation.org/category/plugin/#-rules()

        5
  •  3
  •   jeeber    14 年前

    现在有一个选项可以忽略基于选择器条件的字段,例如不可见或已禁用,这样您就不必更改规则集:

    .validate({
      ignore: ":not(:visible),:disabled",
      ...
    
        6
  •  3
  •   wwanich    12 年前

    rules: {
        address: {
           required: {
                       depends: function(element) {
                         if (....){
                           return true;}
                         else{
                           return false;}
                       }
                     }
                 }
           }
    

    贷方 here .

        7
  •  1
  •   Dan    11 年前

    跟踪验证对象并直接删除/替换规则。在v1.13.0中为我工作

    var validation = $('#form1').validate(); //Keep track of validation object
    
    //Rule set 1
    var validationRulesLogin = {
        headerEmail: {
            required: true,
            email: true
        },
        headerPassword: "required"
    };
    var validationMessagesLogin = {
        headerEmail: {
            required: "Please enter your email address.",
            email: "Not a valid email address."
        },
        headerPassword: "Please enter your password."
    };
    
    //Rule set 2
    var validationRulesSignup = {
        signupEmail: {
            required: true,
            email: true
        },
        signupPassword: "required",
        signupPassword2: {
            equalTo: "#phBody_txtNewPassword"
        }
    };
    var validationMessagesSignup = {
        signupEmail: {
            required: "Please enter your email address.",
            email: "Not a valid email address."
        },
        signupPassword: "Please enter your password.",
        signupPassword2: "Passwords are not the same."
    };
    
    //Toggle rule sets
    function validatingLoginForm(){
        validation.resetForm();
        validation.settings.rules = validationRulesLogin;
        validation.settings.messages = validationMessagesLogin;
    }
    function validationSignupForm(){
        validation.resetForm();
        validation.settings.rules = validationRulesSignup;
        validation.settings.messages = validationMessagesSignup;
    }
    
        8
  •  0
  •   Community Mohan Dere    9 年前

    https://stackoverflow.com/a/20547836/1399001 . 它包括一个工作的jsfiddle。

    $("input[name='userAction']").change(function() {
    
        var settings = $("#myForm").validate().settings;
    
          if ($("input[name='userAction']:checked" ).val() === "login") {
                $.extend(settings, {
                  rules: loginRules
                });
        } else {
                $.extend(settings, {
                  rules: signupRules
                });
        }
    
    
        $("#myForm").valid();
    
    });
    
        9
  •  0
  •   JPuchyr    8 年前

    我有一个类似的问题,并通过在所有登录文本框中添加一个“requiredForLogin”类和在所有注册文本框中添加一个“requiredForSignUp”类来解决它。

    然后使用jQuery的toggleClass和jQuery.validate的addClassRules根据按下的按钮打开和关闭规则。

    function EnableAllValidation() {
        // remove the jquery validate error class from anything currently in error
        //  feels hackish, might be a better way to do this
        $(".error").not("label").removeClass("error");
    
        // remove any the 'disabled' validation classes, 
        //  and turn on all required validation classes 
        //  (so we can subsequently remove the ones not needed)
        $(".requiredForLoginDisabled").toggleClass("requiredForLoginDisabled requiredForLogin");
        $(".requiredForSignUpDisabled").toggleClass("requiredForSignUpDisabled requiredForSignUp");
    }
    function EnableLoginValidation() {
        // reenable all validations
        //  then disable the signUp validations
        EnableAllValidation();
        $(".requiredForSignUp").toggleClass("requiredForSignUpDisabled requiredForSignUp");
    }
    function EnableSignUpValidation() {
        // reenable all validations
        //  then disable the login validations
        EnableAllValidation();
        $(".requiredForLogin").toggleClass("requiredForLoginDisabled requiredForLogin");
    }
    $(document).ready(function () {
        $("input[value='login']").click(function () {
            EnableLoginValidation();
        });
        $("input[value='signup']").click(function () {
            EnableSignUpValidation();
        });
    
        $("#myForm").validate();
        jQuery.validator.addClassRules({
            requiredForSignUp: {
                required: true
            },
            requiredForLogin: {
                required: true
            }
        });
    
    });
    
        10
  •  -2
  •   ngrashia    10 年前

    下面的代码运行得很好。。。

    .validate({
      ignore: ":not(:visible),:disabled",
      ...
    
    推荐文章