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

来源:互联网 发布:网络剧广告植入方案 编辑:程序博客网 时间:2024/05/21 12:33

因为会经常用到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;        }    }});
原创粉丝点击