Javascript 为什么这个异步调用在返回false时不停止
可能重复:Javascript 为什么这个异步调用在返回false时不停止,javascript,jquery,asynchronous,Javascript,Jquery,Asynchronous,可能重复: 出于某种原因,这个ajax调用 $('#new_user').submit(function(e){ $.ajax({ type: 'post', url: "/validate_paypal", dataType: 'json', async: false, data:
出于某种原因,这个ajax调用
$('#new_user').submit(function(e){
$.ajax({
type: 'post',
url: "/validate_paypal",
dataType: 'json',
async: false,
data: {email : $('#user_paypal_email').val()},
success: function( data ) {
if (data.response["valid"] == false){
$('#user_paypal_email').closest('.field').addClass('fieldWithErrors');
$('.error_messages').remove();
$('<span class="error_messages" style="color:#E77776;margin-left: 10px;">This is not a valid paypal email address</span>').insertAfter('#user_paypal_email');
return false;
}
}
});
});
$('new#u user')。提交(函数(e){
$.ajax({
键入:“post”,
url:“/validate\u paypal”,
数据类型:“json”,
async:false,
数据:{email:$('#user_paypal_email').val(),
成功:功能(数据){
if(data.response[“valid”]==false){
$('u#user_paypal_email')。最近('.field')。addClass('fieldWithErrors');
$('.error_messages').remove();
$(“这不是一个有效的paypal电子邮件地址”)。插入(“#用户_paypal_电子邮件”);
返回false;
}
}
});
});
即使打印出我的错误和我的返回值为false,仍在提交表单…为什么这是
$。ajax
是一个函数调用,它定义了一个ajax回调,然后.submit
函数结束。单独(异步)进行AJAX调用,然后您的success函数返回false,基本上为空,因为.submit
已经完成
您真正想要做的是停止表单提交过程,等待AJAX调用完成,然后决定是否继续。这可以通过在第一次完全停止表单提交,然后在获得AJAX回调后手动重新提交表单来实现。当然,诀窍是你怎么知道它是有效的?您可以在submit元素上抛出一个值
例如:
$('#new_user').submit(function(e){
var submitElem = $(this);
// Check for previous success
if (submitElem.data('valid') !== true) {
$.ajax({
type: 'post',
url: "/validate_paypal",
dataType: 'json',
async: false,
data: {email : $('#user_paypal_email').val()},
success: function( data ) {
if (data.response["valid"] == false) {
$('#user_paypal_email').closest('.field').addClass('fieldWithErrors');
$('.error_messages').remove();
$('<span class="error_messages" style="color:#E77776;margin-left: 10px;">This is not a valid paypal email address</span>').insertAfter('#user_paypal_email');
return false;
} else {
// If successful, record validity and submit (allowing to continue)
submitElem
.data('valid', true)
.submit();
}
}
});
return false;
} else {
// Fall through
return true;
}
});
$('new#u user')。提交(函数(e){
var submitElem=$(此项);
//检查以前是否成功
if(submiteme.data('valid')!==true){
$.ajax({
键入:“post”,
url:“/validate\u paypal”,
数据类型:“json”,
async:false,
数据:{email:$('#user_paypal_email').val(),
成功:功能(数据){
if(data.response[“valid”]==false){
$('u#user_paypal_email')。最近('.field')。addClass('fieldWithErrors');
$('.error_messages').remove();
$(“这不是一个有效的paypal电子邮件地址”)。插入(“#用户_paypal_电子邮件”);
返回false;
}否则{
//如果成功,记录有效性并提交(允许继续)
亚远程
.data('valid',true)
.submit();
}
}
});
返回false;
}否则{
//失败
返回true;
}
});
调用是同步的,您正在显式设置async:false
。在$.ajax之前使用e.preventDefault()并将async更改为true——实际上,删除异步行