Étendre le plugin JQuery Validator avec une méthode personnalisée

J’ai ajouté une méthode de validation personnalisée pour valider un mot de passe. Cependant, peu importe si le JSON que je reçois est:

{"success":true} 

ou:

 {"success":false} 

Le mot de passe du champ n’est jamais validé.

 $(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"); } }); } }); }); 

Une idée, qu’est-ce que je fais mal?

Ce que vous faites mal, c’est que lorsque vous ajoutez votre méthode personnalisée, vous ne renvoyez jamais true ou false. Vous le retournez dans le rappel ajax.

 $.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'); 

Au lieu d’append une méthode personnalisée, vous pouvez utiliser la fonction distante :

 $('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"); } }); } }); 

Vous pouvez le vérifier en action ici .