我有一个登录表单,当用户点击提交按钮时,我有一个主要功能,我打电话来决定是否应该迁移该页面。在main函数中,我调用了另外两个函数:一个用于检查用户名和密码字段是否为空,第二个函数有一个ajax,用于检查用户名和密码的组合是否正确:问题是带有ajax的函数由于main函数没有等待内部函数与ajax完成(异步),因此无法正常工作: 这是示例代码:
<h3 id="myerror" style="display:none;">Invalid username or password</h3>
<form action="mylogin.php" onSubmit="return mymain()">
username<input type="text" id="myuname">
password:<input type="password" id="mypass">
</form>
//and the script
<script>
function mymain() {
if (is_not_empty() && is_in_database()) {
return true;
} else {
return false;
}
}
function is_not_empty() {
var uname = $("#myuname").val();
var pass = $("#mypass").val();
if (uname == "" && pass == "") {
$("#myerror").css("display", "block");
return false;
} else {
return true;
}
}
var a;
function isthere() {
var uname = $("#myuname").val();
var pass = $("#mypass").val();
//the ajax php below returns either isthere or notthere with reference to the username
and password combination.
$.post("http://localhost/passtester/pass1.php", {
username: uname,
password: pass
}, function (feedbak) {
a = feedbak;
});
if (a == "isthere") return true;
if (a == "notthere") return false;
}
</script>
我将非常感谢您的帮助
答案 0 :(得分:1)
使用成功功能
$.ajax({
success: function(data){
},
error: function(error){
}
});
答案 1 :(得分:1)
您的问题属于这一部分:
$.post("http://localhost/passtester/pass1.php", {username:uname,password:pass}
,function(feedbak)
{
a=feedbak;
});
if(a=="isthere")
return true;
if(a=="notthere")
return false;
}
您的条件超出了回调函数的范围,并且在处理ajax请求之前将被调用:
应该很可能是这样的:
$.post("http://localhost/passtester/pass1.php", {username:uname,password:pass}
,function(feedbak)
{
a=feedbak;
if(a=="isthere")
return true;
if(a=="notthere")
return false;
}
});
更好的方法是在jquery中使用$.ajax()
函数,而不是使用简写$.post
。这样,您就可以访问.success
和.error
个事件。在这种情况下,当用户名/密码错误时,您将使用api在登录成功(.success)或401(未授权)或类似的东西时返回200。这样,您可以轻松区分成功尝试和错误尝试。并且可以通知用户发生了什么
希望这有帮助。
答案 2 :(得分:1)
您无法从异步方法返回值,而是需要使用类似
的回调方法function mymain() {
if (is_not_empty()) {
is_in_database(function (isthere) {
if (isthere) {
$('form').submit();
}
})
}
return false;
}
function is_not_empty() {
var uname = $("#myuname").val();
var pass = $("#mypass").val();
if (uname == "" && pass == "") {
$("#myerror").css("display", "block");
return false;
} else {
return true;
}
}
function is_in_database(callback) {
var uname = $("#myuname").val();
var pass = $("#mypass").val();
//the ajax php below returns either isthere or notthere with reference to the username and password combination.
$.post("http://localhost/passtester/pass1.php", {
username: uname,
password: pass
}, function (feedbak) {
callback(feedbak == "isthere")
});
}