带有ajax响应的javascript函数返回错误

带有ajax响应的javascript函数返回错误,javascript,ajax,return,Javascript,Ajax,Return,可能重复: 我对这个代码有问题 当此函数返回FALSE时,它工作正常 但如果它返回真值,则不会返回 我希望在函数返回TRUE时提交表单 <form action='register.php' method="post" onsubmit="return validate()" > ... </form> 。。。 这是剧本 <script language="JavaScript"> function validate() { var tore

可能重复:

我对这个代码有问题

当此函数返回FALSE时,它工作正常

但如果它返回真值,则不会返回

我希望在函数返回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>

函数验证()
{
var-toreturn=false;
if(window.XMLHttpRequest)
{//IE7+、Firefox、Chrome、Opera、Safari的代码
xmlhttp=新的XMLHttpRequest();
}
其他的
{//IE6、IE5的代码
xmlhttp=新的ActiveXObject(“Microsoft.xmlhttp”);
}
var e=document.getElementById('e').value;
var p=document.getElementById('p')。值;
var r=document.getElementById('r')。值;
xmlhttp.onreadystatechange=函数()
{
if(xmlhttp.readyState==4&&xmlhttp.status==200)
{
如果(xmlhttp.responseText!=“确定”)
{
document.getElementById(“msg”).innerHTML=xmlhttp.responseText;
$(函数(){
$(“#msg”).hide().fadeIn(“慢”);
}, 3000);
}
否则返回=真;
}
}
open(“POST”、“register_validate.php”);
setRequestHeader(“内容类型”,“应用程序/x-www-form-urlencoded”);
xmlhttp.send(“e=“+e+”&p=“+p+”&r=“+r”);
回归回归;
}

如评论中所述,您的异步代码有问题。当您从
validate
函数返回时,您的
toreturn
变量尚未填写

对于AJAX回调:

xmlhttp.onreadystatechange = function () {
    // ...
}
您可以想象,在当前函数完成后(特别是当AJAX请求的就绪状态更改时),放入该函数中的代码将被“放到一边”并在稍后调用

您要做的是使您的按钮不是提交按钮。然后,在AJAX回调中,如果获得成功结果,请提交表单(这需要为表单提供一个id):


通过在中添加false解决了该问题

xmlhttp.open("POST","register_validate.php",false);
感谢@Felix Kling at的回答


添加假值使函数同步

您不能这样做。。。您的最佳选择是在收到响应时再次触发提交事件。是的,但这将使浏览器在请求完成之前无响应。说真的,不要这样做,去异步并使用回调。@bfavaretto如果我现在等待的响应只花了很短的时间,那么我仍然使用它可以吗?问题是,你不知道所有用户需要多长时间。
xmlhttp.open("POST","register_validate.php",false);