submitHandler 在第一次提交表单之前不会触发。如果您想在用户第一次填写表单时检查用户名的唯一性,您需要一个单独的函数。下面的示例假设您有一个页面运行 SQL 查询以查看提供的用户名是否存在于数据库中,然后返回一个 json 字符串,例如"{taken:false}"
用户名是否唯一
$('#yourForm [name="username"]').on('blur',function(){
var username = $(this).val();
$.get('check/username.php',{username:username},function(data) {
if(data.taken) {
// highlight the field and indicate that the username is already taken
}
},'json');
}
调用的细节$.get
取决于你的后端是如何设置的。但总的来说,这个过程会:
- 用户输入用户名
- 用户模糊了场外
- 对服务器进行 $.get 或 $.ajax 调用以检查用户名的唯一性
- 如果来自服务器的响应表明用户名不是唯一的,请处理您的验证(突出显示该字段,添加X图标等)并且要么
- 在用户名唯一之前阻止表单提交,或者
- 让表单提交并返回重复用户名的错误
更新
如果要为验证插件创建新规则,可以执行以下操作:
function isUsernameUnique(username,field) {
var unique = false;
$.ajax({
url: 'path/to/usernameCheck/',
data: { username: username },
async: false,
success: function(data) { unique = data.unique; }
});
return unique;
}
$.validator.addMethod(
'uniqueUsername',
isUsernameUnique,
'That username is already in use. Please choose a unique username.'
);
然后,在表单的 validate 函数中:
$('#yourForm').validate({
...
rules: {
username: { uniqueUsername: true }
...
}
...
});
并且,您的用户名字段的单独blur
功能:
$('[name="username"]').on('blur',function(){
var unique = isUsernameUnique($(this).val(),$(this));
if(!unique) {
// handle error
}
});
这使您可以为预提交验证和验证插件重用相同的功能。但是,我在这里看到两个问题:
1 - 在您第一次提交后,$.fn.validate() 将急切地验证您的用户名字段,这意味着blur
不再需要用户名字段上的事件。也许您可以在第一次提交后禁用它以防止不必要的 ajax 调用
2 - 它不是 100% DRY,因为您需要在blur
事件处理程序中进行自己的错误处理