40

Let's say I have a custom AddMethod to jQuery Validate like:

$.validator.addMethod('min-length', function (val, element) {
    // do stuff

// the error message here needs to be dynamic
}, 'The field cannot be less than than '
     + element.attr('data-min') + // it is within the closure, but it can't grab it
   ' length.');

I can't figure out a way to get the element variable in question, and get any values from it. What am I missing here?

1
  • 2
    From the documentation, addMethod can take a function as the 3rd (i.e. message) param. See what happens when you pass a function, and inside it console.log(this). There's a good chance that this will be the element you're interested in. Or, maybe element is passed in as a param, just like it is for the other function you have. Commented Nov 12, 2012 at 22:43

6 Answers 6

90

From looking at the validator source code, I think this should do it:

$.validator.addMethod('min-length', function (val, element) {
    return this.optional(element) || val.length >= $(element).data('min');
}, function(params, element) {
    return 'The field cannot be less than than ' + $(element).data('min') + ' length.';
});

In your original code, the message string is NOT within the closure; the closure is the 2nd argument of addMethod, and the error message is the 3rd argument.

Sign up to request clarification or add additional context in comments.

8 Comments

Thanks so much Barmar! Had no idea you could do that :) Also you're right it isn't in the closure, my mistake.
Just what I was looking for. A tiny step further, you can construct a custom error message inside the validation function, and stash it in the element's data, e.g $(element).data('error','... custom message ...') and then recover it in the message function via return $(element).data('error')
One other addition is that if there is a message defined elsewhere, on the ruleset, for example, this 3rd parameter to addMethod will be ignored. I thought the validator would use the parameter first, then use the default if null or an empty string was returned.
element isn't a jQuery object. Does it need to be turned into one?
@Barmar: what happens to params in the 3rd argument? I tried console.log( params ); and its printing true. Where does this argument comes from?
|
6

First of all, I appreciate Barmar answer.

If you just think , you can use any of the jquery validation message with it's param value , you can call simply the message instances.

Here is the code

            jQuery.validator.addMethod("custom_min", function(value, element, param) {
                value = replaceAll(value, ',' , '');
                return this.optional( element ) || value >= param;
            },jQuery.validator.messages.min );  

In jquery validation

jQuery('#form_id').validate({
   rules: {
    'field_name': {
       required: true,
       number: true,
       custom_min: 1000
   }
});

So if you enter something less than 1000. it will throw you error message,"Please enter value greater than 1000(the amount you put in the validation)".This method will be faster if your validation needs any modification of any current method or you are developing it with multiple language.

1 Comment

I have upvoted your answer because it does solve the example presented in the question but Barmar's answer gives a more generic solution, which was what I was looking for when I landed in this page.
2

Found this semi by accident. My messages are very dynamic depending on the result. so right before I call validate I add an attribute data-msg="My custom message" to the element. Validator will pick that up:

err_msg = 'My custom message';
$('#my_element_id').attr('data-msg', err_msg);
$('#my_form_id').validate().element('input[name=\'my_element_name\'');

found some code references under customDataMessage in jquery.validate.js

Comments

2

If Barmar's answer doesn't work for you, it is probably because your settings for the element already contains an error message(set from the server in asp.net MVC for example)

So the jQuery.validate code will ignore the new default set by the second parameter to $.validator.addMethod

A way around it is to do the following:

$.validator.addMethod('min-length', function (val, element) {
   this.settings.messages[element.name]['min-length'] = function () { return 'put your custom message here'; };

   return this.optional(element) || val.length >= $(element).data('min');
});

1 Comment

I had a custom error ValidationAttribute set on a C# property (MVC) - I couldn't change this attribute without affecting other projects and so this answer was the only thing that worked for me. This answer deserves more upvotes!
0

late to the party here, but this seems to work for me:

jQuery.validator.addMethod("minDate", function(value, element, param) {
    var inputDate = new Date(value);
    return (inputDate >= param)
    }, function(param, element) {
        return 'Enter a date greater than or equal to ' + $.datepicker.formatDate("M d, yy", new Date(param));
});

where the minDate value has previously been set on the control to validate something like this:

$('form:first').validate({
    rules: {
        "date-filed": {
            minDate: new Date(2000,0,0)
        },
...

Comments

0

code:

    $.validator.addMethod("strongePassword", function(value) {
        return /^[A-Za-z0-9\d=!\-@._*]*$/.test(value) && /[a-z]/.test(value) && /\d/.test(value) && /[A-Z]/.test(value);
    },"The password must contain at least 1 number, at least 1 lower case letter, and at least 1 upper case letter"); 
        

Uses to :

  rules: { 
        password: {
                    required: !0,
                    strongePassword: true
                 },
     }

1 Comment

Before you paste this in even more locations, please take the time to read Is it acceptable to add a duplicate answer to several questions?.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.