我有一个带有由datepicker()填充的文本字段的表单,我试图在按钮的单击事件处理程序中验证programmaticaly:
var formValid = true;
console.log( Date.now() + ' initial value: ' + formValid );
$('#expiryDate').validate(function(valid,elem){
if(!valid){ formValid = false; }
console.log( Date.now() + ' in expiryDate validate: ' + formValid );
});
console.log( Date.now() + ' after expiryDate validate: ' + formValid );
$('#documentName').validate(function(valid,elem){
if(!valid){ formValid = false; }
console.log( Date.now() + ' in documentName validate: ' + formValid );
});
console.log( Date.now() + ' after documentName validate: ' + formValid );
if(!formValid){
console.log( Date.now() + ' no post...' );
$('.btn').prop('disabled' ,false );
return;
}
console.log( Date.now() + ' would post now...' );
//$.post();
documentName的验证正确并同步返回。但是,expiryDate的验证不会:formValid在评估它以决定是返回还是执行$ .post()时仍然为true。
如果我添加了console.log()输出,我发现expiryDate字段的验证器在代码已经执行了$ .post()后返回得很好。
因此,即使验证失败,也会通过$ .post()提交数据。
我错过了什么?
这是console.log()结果(数字是用于检查时间的滴答计数; true / false是指formValid的值):
1526495506879 initial value: true
1526495506881 after expiryDate validate: true
1526495506882 in documentName validate: true
1526495506883 after documentName validate: true
1526495506883 would post now...
1526495507084 in expiryDate validate: false
1526495507086 in expiryDate validate: false
答案 0 :(得分:0)
如果在另一个回调中嵌入一个验证,然后在内部验证回调中嵌入post请求,会发生什么情况,如下所示:
var formValid = true;
console.log(Date.now() + ' initial value: ' + formValid);
$('#expiryDate').validate(function (valid, elem) {
if (!valid) { formValid = false; }
console.log(Date.now() + ' in expiryDate validate: ' + formValid);
$('#documentName').validate(function (valid, elem) {
if (!valid) { formValid = false; }
console.log(Date.now() + ' in documentName validate: ' + formValid);
if (!formValid) {
console.log(Date.now() + ' no post...');
$('.btn').prop('disabled', false);
} else {
console.log(Date.now() + ' would post now...');
//$.post();
}
});
});