我有一个 SIGN IN
按钮,那个onclick
调用函数 login()
.里面login()
我调用了 2 个函数:
function login()
{
signin();
statistics_table();
return false;
}
signin();
执行实际登录 ( $_SESSION['name']=$username;
) ( ajax
) 和 statistics_table();
打印出一个与用户相关的表格或一条文本,上面写着“请登录以查看您的统计信息”(以防登录失败)(还有 ajax
)。
问题是 statistics_table()
总是打印出“请登录...”。就好像 signin()
尚未执行实际登录。显然它只在函数 login()
之后执行它返回。
那么有没有办法让signin()
在它完成后立即应用它的操作?
我还尝试让按钮调用函数 signin()
和 statistics_table()
一个接一个,像这样:
<input type="submit" value="Sign In" onclick="signin(); statistics_table();">
但是这样当我点击按钮时它有点重新加载页面(同样,我需要它是 ajax)。
提前致谢
编辑:
这里是 signin()
的实现:
function signin()
{
var name = document.getElementById('name').value;
var pw= document.getElementById('password').value;
if (window.XMLHttpRequest)
{
xmlhttp=new XMLHttpRequest();
}
else
{
xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
}
xmlhttp.onreadystatechange=function()
{
if (xmlhttp.readyState==4 && xmlhttp.status==200)
{
document.getElementById("Test").innerHTML=xmlhttp.responseText;
}
}
xmlhttp.open("POST","members.php?name="+name+ "&password="+pw,true);
xmlhttp.send();
return false;
}
最佳答案
您只需将 statistics_table()
调用移动到内部 onreadystatechange
回调 readyState == 4
, 因此在用户登录成功完成后调用。
xmlhttp.onreadystatechange=function()
{
if (xmlhttp.readyState==4 && xmlhttp.status==200)
{
// You're already writing some output with the XHR response
document.getElementById("Test").innerHTML=xmlhttp.responseText;
// So no problem writing a little more in the user's table:
statistics_table();
}
}
然后调用者 login()
被缩减为:
function login()
{
signin();
return false;
}
另一个问题:我注意到您正在尝试发起一个 POST
请求,但实际上您是在查询字符串中传递参数,PHP 将在其中以 $_GET 的形式接收它们
。参数不是查询字符串,而是属于 .send()
的参数:
xmlhttp.open("POST","members.php", true);
// Set the correct Content-type header for a POST form
xmlhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
xmlhttp.send("name=" + encodeURIComponent(name) + "&password="+encodeURIComponent(pw));
关于javascript - 有没有办法让函数在完成后立即采取行动?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21819012/