How can we specify rules for jquery validation plugin by class?

前端 未结 9 1380
一生所求
一生所求 2020-11-27 11:19

The jQuery Validation plugin works great and is very easy to use:

$(\".selector\").validate({
})

Just by setting css classes like \"require

相关标签:
9条回答
  • 2020-11-27 11:58

    Alternative approach:

    $.validator.addMethod("cMaxlength", function(value, element, param) {
    		
    	return $.validator.methods.maxlength.call(this, value, element, param[1]);
    
    }, '{0}');

    Gist: https://gist.github.com/uhtred/833f3b957d61e94fbff6

    $.validator.addClassRules({
        'credit-card': {
        	cMaxlength: [ 'Invalid number.', 19 ]
        }
    });

    0 讨论(0)
  • 2020-11-27 12:00

    You can add class rules using the addClassRules method:

    E.g.

    $.validator.addClassRules("your-class", {
      required: true,
      minlength: 2
    });
    

    https://jqueryvalidation.org/jQuery.validator.addClassRules/

    0 讨论(0)
  • 2020-11-27 12:07

    jQuery.validator.addClassRules(); will attach the validation to class, but there is no option for messages, it will use the general error messages.

    If you want that to work then, you should refactor the rules like this

    $.validator.addMethod(
         "newEmail", //name of a virtual validator
         $.validator.methods.email, //use the actual email validator
         "Random message of email"
    );
    
    //Now you can use the addClassRules and give a custom error message as well.
    $.validator.addClassRules(
       "email", //your class name
       { newEmail: true }
     );
    
    0 讨论(0)
  • 2020-11-27 12:09

    For the purposes of my example, this is the base starting code:

    HTML:

    <input type="text" name="field_1" />
    <input type="text" name="field_2" />
    <input type="text" name="field_3" />
    

    JS:

    $('#myForm').validate({
        rules: {
            field_1: {
                required: true,
                number: true
            },
            field_2: {
                required: true,
                number: true
            },
            field_3: {
                required: true,
                number: true
            }
        }
    });
    

    DEMO: http://jsfiddle.net/rq5ra/


    NOTE: No matter which technique below is used to assign rules, it's an absolute requirement of the plugin that every element has a unique name attribute.


    Option 1a) You can assign classes to your fields based on desired common rules and then assign those rules to the classes. You can also assign custom messages.

    HTML:

    <input type="text" name="field_1" class="num" />
    <input type="text" name="field_2" class="num" />
    <input type="text" name="field_3" class="num" />
    

    The .rules() method must be called after invoking .validate()

    JS:

    $('#myForm').validate({
        // your other plugin options
    });
    
    $('.num').each(function() {
        $(this).rules('add', {
            required: true,
            number: true,
            messages: {
                required:  "your custom message",
                number:  "your custom message"
            }
        });
    });
    

    DEMO: http://jsfiddle.net/rq5ra/1/

    Option 1b) Same as above, but instead of using a class, it matches a common part of the name attribute:

    $('[name*="field"]').each(function() {
        $(this).rules('add', {
            required: true,
            number: true,
            messages: { // optional custom messages
                required:  "your custom message",
                number:  "your custom message"
            }
        });
    });
    

    DEMO: http://jsfiddle.net/rq5ra/6/


    Option 2a) You can pull out the groups of rules and combine them into common variables.

    var ruleSet1 = {
            required: true,
            number: true
        };
    
    $('#myForm').validate({
        rules: {
            field_1: ruleSet1,
            field_2: ruleSet1,
            field_3: ruleSet1
        }
    });
    

    DEMO: http://jsfiddle.net/rq5ra/4/


    Option 2b) Related to 2a above but depending on your level of complexity, can separate out the rules that are common to certain groups and use .extend() to recombine them in an infinite numbers of ways.

    var ruleSet_default = {
            required: true,
            number: true
        };
    
    var ruleSet1 = {
            max: 99
        };
    $.extend(ruleSet1, ruleSet_default); // combines defaults into set 1
    
    var ruleSet2 = {
            min: 3
        };
    $.extend(ruleSet2, ruleSet_default); // combines defaults into set 2
    
    var ruleSet3 = { };
    $.extend(ruleSet3, ruleSet1, ruleSet2); // combines sets 2 & 1 into set 3.  Defaults are included since they were already combined into sets 1 & 2 previously.
    
    $('#myForm').validate({
        rules: {
            field_1: ruleSet2,
            field_2: ruleSet_default,
            field_3: ruleSet1,
            field_4: ruleSet3
        }
    });
    

    End Result:

    • field_1 will be a required number no less than 3.
    • field_2 will just be a required number.
    • field_3 will be a required number no greater than 99.
    • field_4 will be a required number between 3 and 99.

    DEMO: http://jsfiddle.net/rq5ra/5/

    0 讨论(0)
  • 2020-11-27 12:11

    You could use addClassRules, like:

    
    jQuery.validator.addClassRules("name", {
      required: true,
      minlength: 2
    });
    
    
    0 讨论(0)
  • 2020-11-27 12:12

    I've built upon Starx's answer to create a repeatable easy to use function that uses the default methods and creates new error messages for specific classes. considering the fact that your specific class will only be used to override the message once you shouldn't have any conflicts reusing this for many different class names using any existing methods.

    var CreateValidation = function(className, customMessage, validationMethod){
      var objectString = '{"'+ className +'": true}',
      validator = $.validator;
    
      validator.addMethod(
        className,
        validator.methods[validationMethod],
        customMessage
      );
      validator.addClassRules(
        className,
        JSON.parse(objectString)
      );
    };
    

    Usage Example with validation class being "validation-class-firstname":

    CreateValidation('validation-class-firstname', 'Please enter first name', 'required');
    
    0 讨论(0)
提交回复
热议问题