所以我有一个表单,我在使用 jquery-form-validator 插件提交之前验证!但是这里的问题是success
上写的几行在逐步执行时没有被执行。 但是,如果在console
中执行或使用debugger
执行,则效果正常。真的是一个wiered行为!!有任何解决方法可以解决这个问题吗?
JS
$.validate({
form:'#contact-form',
onError: function () {
toastr.error("Please correct the below errors!", "Error");
return false;
},
onSuccess: function () {
$("#btnContactUs").button('loading'); //Not getting called
$('.form-contact form').find('input,textarea').attr('readonly', true).addClass('disabled'); //Not getting called
var formdata = new FormData($('.form-contact form').get(0));
$.ajax({
url: $("#contact-form").attr('action'),
type: 'POST',
data: formdata,
processData: false,
contentType: false,
success:function(data)
{
if(data.result)
{
toastr.success(data.message, "Success");
$('.form-contact form').get(0).reset();//Check this
}
else
{
toastr.error(data.message, "Error");
}
},
error:function(data)
{
toastr.error(data.message, "Error");
}
});
$("#btnContactUs").button('reset');
$('.form-contact form').find('input,textarea').attr('readonly', false).removeClass('disabled');
return false; // Will stop the submission of the form
}
});
在验证成功时,它通过ajax调用Controller方法,但不执行前2行。
更新:按钮#btnContactUs
是一个自举按钮,具有.button
功能,可显示加载文字。
答案 0 :(得分:1)
当您尝试访问的控件不可用或者您在上一个过程完成之前启动一个进程时,通常会发生这种情况。为了在不考虑这些情况的情况下运行您的AJAX,请尝试在未被执行的行之上添加以下setTimeout或SetInterval。
语法: SetTimeout:http://www.w3schools.com/jsref/met_win_settimeout.asp SetInterval:http://www.w3schools.com/jsref/met_win_setinterval.asp
希望这会有所帮助!!
答案 1 :(得分:1)
你的onSuccess()方法的返回false正在你的内部ajax成功回调可以运行之前执行。当您放置调试器时,会发生ajax成功回调事件,并且您的代码运行正常。
我们可以使用jquery的 $.when
和 .then
功能解决此问题,如下所示:
$.when(
$.ajax({
url: $("#contact-form").attr('action'),
type: 'POST',
data: formdata,
processData: false,
contentType: false,
success:function(data)
{
if(data.result)
{
toastr.success(data.message, "Success");
$('.form-contact form').get(0).reset();//Check this
}
else
{
toastr.error(data.message, "Error");
}
},
error:function(data)
{
toastr.error(data.message, "Error");
}
})
).then(function(){
$("#btnContactUs").button('reset');
$('.form-contact form').find('input,textarea').attr('readonly', false).removeClass('disabled');
});