可能重复:
How to return the response from an AJAX call from a function?
我遇到了这段代码的问题。
当此函数返回FALSE时,它可以正常工作。
但如果它返回TRUE,则不会。
我希望在函数返回TRUE时提交表单。
<form action='register.php' method="post" onsubmit="return validate()" > ... </form>
这是脚本
<script language="JavaScript">
function validate()
{
var toreturn = false;
if (window.XMLHttpRequest)
{// code for IE7+, Firefox, Chrome, Opera, Safari
xmlhttp=new XMLHttpRequest();
}
else
{// code for IE6, IE5
xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
}
var e = document.getElementById('e').value;
var p = document.getElementById('p').value;
var r = document.getElementById('r').value;
xmlhttp.onreadystatechange=function()
{
if (xmlhttp.readyState==4 && xmlhttp.status==200)
{
if(xmlhttp.responseText != "ok")
{
document.getElementById("msg").innerHTML = xmlhttp.responseText;
$(function() {
$("#msg").hide().fadeIn("slow");
}, 3000);
}
else toreturn = true;
}
}
xmlhttp.open("POST","register_validate.php");
xmlhttp.setRequestHeader("Content-type","application/x-www-form-urlencoded");
xmlhttp.send("e="+e+"&p="+p+"&r="+r);
return toreturn;
}
</script>
答案 0 :(得分:1)
如评论中所述,您遇到异步代码问题。从toreturn
函数返回时,validate
变量未填写。
对于AJAX回调:
xmlhttp.onreadystatechange = function () {
// ...
}
你可以想象你放在该函数中的代码将被“放在一边”并在你的当前函数完成后调用(特别是当AJAX请求的就绪状态发生变化时)。
您要做的是让您的按钮不是提交按钮。然后,在您的AJAX回调中,如果您获得了成功的结果,则提交表单(这将需要为表单提供id):
xmlhttp.onreadystatechange = function () {
if (xmlhttp.readyState == 4 && xmlhttp.status == 200) {
if (xmlhttp.responseText != "ok") {
document.getElementById("msg").innerHTML = xmlhttp.responseText;
$(function () {
$("#msg").hide().fadeIn("slow");
}, 3000);
} else document.getElementById('your-form-id').submit();
}
}
答案 1 :(得分:0)
通过在
中添加false来解决问题xmlhttp.open("POST","register_validate.php",false);
感谢@Felix Kling在How do I return the response from an asynchronous call?
的回答添加FALSE值,使函数SYNCHRONOUS