我对Jquery有一点问题,并想知道是否有人可以提供帮助
我有一个表单,我正在验证模糊
$('form#setAdminUser :input').blur(function () {
var $item = $(this);
var $itemWrapper = $(this).parent();
$itemWrapper.find('input').removeClass('errorRow').end()
.find('span').remove();
// There are other validation rules here I have ommitted..
// Email validation
if (this.id == 'sEmail') {
// Email Unique
if (this.value != '') {
var errorMessage = 'Checking availability';
var emailData = {sEmail: itemValue}
$.getJSON('http://localhost:8501/ems/trunk/www/cfcs/admin_user_service.cfc?method=getAdminUser&returnFormat=json&queryformat=column', emailData,
function(data){
if (data != false) {
var errorMessage = 'This email address has already been registered';
$itemWrapper.find('span').text(errorMessage).addClass('errorInfoFalse').removeClass('errorInfoTrue');
$item.addClass('errorRow');
}
else {
var errorMessage = 'Good';
$itemWrapper.find('span').text(errorMessage);
$item.removeClass('errorRow');
}
})
}
}
这很好用,并检查表单中添加的电子邮件地址是否已在数据库中。如果是这样,则显示错误,如果没有进展。
然后我通过触发验证字段上的模糊,在表单提交上再次调用此验证。
$('#setAdminUser').submit(function(){
$('#submitMessage').remove();
$(':input.conditional').trigger('blur');
$(':input.text_field').trigger('blur');
var numWarnings = $('.errorRow',this).length;
if (numWarnings) {
// Show error messages
}
else {
// Everything is fine, create User
}
return false
})
如果任何其他字段无效,而电子邮件字段无效,例如密码太短或字段留空,则在提交表单时,将调用on blur验证。显示所有错误,包括电子邮件,并且未创建用户。
但是,如果仅电子邮件字段无效,则不会显示错误并创建用户。我猜这是因为电子邮件验证是一个ajax调用,这发生得太慢了?有任何想法吗?感谢
答案 0 :(得分:2)
AJAX调用是异步进行的,当您为输入手动触发blur事件时,submit事件将不会等待它们。您应该做的是在提交事件中进行另一个AJAX调用,在该事件中将所有输入值传递给要验证的脚本,然后检查回调中验证的状态。如果它已经过验证,那么提交表格,基本上就是这样:
var isValid = false;
$('#setAdminUser').submit(function() {
if (isValid) {
return true;
}
var data = $(this).serialize();
$.getJSON('/validate/data', data, function(status) {
if (status) {
isValid = true;
$('#setAdminUser').submit();
}
});
return false;
});