因为会经常用到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;
}
}
});