表单提交前onclick使用reuturn时,ajax请求同步异步的一点注意事项

因为会经常用到ajax提交请求判断一些信息,比如,用户账号名是否存在等等,但如果是在提交表单数据按钮的onclick时,用return check()来跳转去最后验证一下表单数据是否为空等等。需要注意一些问题。

当进行ajax请求时,如果success回调得到的结果是错误的,使用return false是没有办法返回check()函数false结果的,因为你在回调函数里,只是返回在里层的函数。于是会发现表单照样提交。比如:

function check(){
    $name = $("#name").val();
    $.post("check.php",{name:name},function(data){
        data = JSON.parse(data);
        if(data.code != 200){
            return false;
        }
    });
}

上面的代码return false只是跳出ajax请求函数而已,并没有给check函数任何返回。

于是会想到使用临时标记变量去判断识别:例如

function check(){
    $name = $("#name").val();
    $flag = 0;
    $.post("check.php",{name:name},function(data){
        data = JSON.parse(data);
        if(data.code != 200){
            return false;
        }else{
            flag = 1;
            return true;
        }
    });

    if(flag === 0){
        return false;
    }
    return true;
}

可是这样再试,你会发现表单是不进行提交了,但是你回调数据判断正确时,你却怎么也提交不了表单!这时可以在flag判断前打印flag的值console.log(flag),发现flag=0,而不是1。

然后你仔细观察会发现在命令行里,flag的值的打印时间比ajax请求完成时间更早,这是因为 $.get/post函数默认使用的是异步通信。当请求时,会相别于主线程,再开始一个线程用于ajax请求,两个线程同时进行。

因此在这种情况下,你需要使用同步通信,只能使用$.ajax函数进行ajax请求

$.ajax({
    url: "check.php",
    type: "POST",
    async: false,    //同步请求
    data: {name:name},
    success: function(data){
       data = JSON.parse(data);
        if(data.code != 200){
            return false;
        }else{
            flag = 1;
            return true;
        }
    }
});
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值