Extend JQuery Validator Plugin with custom method

jquery, jquery-plugins, jquery-validate, json, validation

Solution

What you do wrong is that when you add your custom method you never return true or false from it. You return it in the ajax callback.

$.validator.addMethod('authenticate', function (value) { 
    $.getJSON("./json/authenticate.do",{ password: value }, function(json) { 
        // This return here is useless
        return (json.success == true) ? true : false;
    }); 
    // You need to return true or false here...
    // You could use a synchronous server call instead of asynchronous
}, 'Wrong password');

Instead of adding a custom method you could use the remote function:

$('form#changePasswordForm').validate({
    rules: {
        repeat_new_password: { 
            equalTo: "#new_password" 
        },
        password : { 
            // This will invoke ./json/authenticate.do?password=THEVALUE_OF_THE_FIELD 
            // and all you need to do is return "true" or "false" from this server script
            remote: './json/authenticate.do' 
        }
    }, 
    messages: { 
        password: { 
            remote: jQuery.format("Wrong password")
        }
    },
    submitHandler: function(form) {
        $(form).ajaxSubmit({
            dataType: "json", 
            success: function(json) {
                alert("foo");
            }
        });                     
    }
});   

You can check it out in action here.

Problem

I added a custom validation method to validate a password. However, it does not matter if the JSON I get is: ``` {"success":true} ``` or: ``` {"success":false} ``` The field password never validates. ``` $(document).ready(function () { // Ad custom validation $.validator.addMethod('authenticate', function (value) { $.getJSON("./json/authenticate.do", { password: value }, function (json) { return (json.success == true) ? true : false; } ); }, 'Wrong password'); $('form#changePasswordForm').validate({ rules: { repeat_new_password: { equalTo: "#new_password" }, password: { authenticate: true } }, submitHandler: function (form) { $(form).ajaxSubmit({ dataType: "json", success: function (json) { alert("foo"); } }); } }); }); ``` Any idea, what I am doing wrong?

Original source