Vous pouvez facilement détourner les rappels du mécanisme de validation en utilisant le validate method options. Voici un exemple (également mis sur jsbin):
<html>
<head>
<script type="text/javascript" src="http://code.jquery.com/jquery-1.4.3.min.js"></script>
<script type="text/javascript" src="http://ajax.microsoft.com/ajax/jquery.validate/1.7/jquery.validate.min.js"></script>
</head>
<body>
<script>
$(function() {
var button = $('#submit1');
function buttonHandler(validator) {
var errors = validator.numberOfInvalids();
if(errors === 0) {
button.removeAttr('disabled');
} else {
button.attr('disabled', 'disabled');
}
}
$('#form1').validate({
rules: {
text1: { required: true }
},
errorPlacement: function (error, element) {
error.insertAfter(element);
buttonHandler(this);
},
highlight: function (element, errorClass, validClass) {
$(element).addClass(errorClass);
$(element).removeClass(validClass);
buttonHandler(this);
},
unhighlight: function (element, errorClass, validClass) {
$(element).addClass(validClass);
$(element).removeClass(errorClass);
buttonHandler(this);
}
}).form(); // trigger validation
});
</script>
<form id="form1" action="#">
<input id="text1" name="text1" type="text" /><br/>
<input id="submit1" name="submit1" type="submit" value="Test" disabled="disabled" />
</form>
</body>
</html>
La clé est de déclencher la validation ici avant toute intervention de l'utilisateur (en utilisant la méthode validator.form()), donc jquery.validate commence à écouter les événements d'entrée, et commence à déclencher les rappels lorsque les événements de touche (et autres) se déclenchent.
C'est une mauvaise expérience utilisateur. – TheExit
Quand vous pouvez difficilement valider (c'est un e-mail en db, ...), le seul moyen est d'envoyer des données au serveur et de les valider ici. Pourquoi une mauvaise expérience? – Dingo