我有以下功能用于检查电子邮件地址是否已经注册。
checkTaken() {
var email_var = $('input#email').val();
$.post("../includes/check_email.inc.php",{email:email_var} ,function(data) {
var ret = data + "";
if(ret=="true") {//if username not avaiable
$('div#emailTaken').show();
$('input#email').addClass('redBack');
return false;
} else {
$('div#emailTaken').hide();
$('input#email').removeClass('redBack');
return true;
}
});
}
当我使用以下内容调用它时,它可以正常工作:
email.blur(checkTaken);
但是当我做
之类的事情时var test1 = checkTaken();
或
if(chekTaken) {
奇怪的事情发生了。它进入函数,执行$ .post行,但从不进入其余的例程。为什么是这样?我该如何解决?
作为一个注释,当我使用最后两个示例调用该函数时,我确实从服务器获取了seen through firebug的信息。如果我为test1添加一个监视,它仍未定义。
答案 0 :(得分:1)
您正在使用同步函数调用混合异步后回调。从回调返回不会返回被叫方。
答案 1 :(得分:0)
这种情况正在发生,因为checkTaken()
在返回之前不等待$.post
完成,因为$.post
将触发异步请求到服务器。你可以做的是改用$.ajax
并将async
选项设置为false
(请记住,它会在等待请求完成时暂时阻止浏览器。)
答案 2 :(得分:0)
原因是AJAX中的第一个A意味着“异步”。这意味着您的代码在HTTP请求完成之前继续执行。当请求 完成时,运行处理程序函数。因此,您必须构建代码以考虑到这一点。这通常意味着将所有代码放在处理函数中依赖于AJAX请求,就像您已经在某种程度上所做的那样。
$.post("../includes/check_email.inc.php",{email:email_var} ,function(data) {
var ret = data + "";
if(ret=="true") {//if username not avaiable
$('div#emailTaken').show(); // this works
$('input#email').addClass('redBack'); // this works
return false; // this does nothing
} else {
$('div#emailTaken').hide(); // this works
$('input#email').removeClass('redBack'); // this works
return true; // this does nothing
}
});
答案 3 :(得分:0)
这是因为你的return语句在$ .post请求中,而不是在函数中。不是一回事。
您的功能不会返回任何值,这就是您不输入其他代码的原因。