【问题标题】:javascript function return error with ajax response [duplicate]带有ajax响应的javascript函数返回错误[重复]
【发布时间】:2013-01-19 01:53:40
【问题描述】:

可能重复:
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>

【问题讨论】:

  • 你不能那样做......你最好的选择是在收到响应时再次触发提交事件。

标签: javascript ajax return


【解决方案1】:

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

对于 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();
    }
}

【讨论】:

    【解决方案2】:

    通过在中添加false解决的问题

    xmlhttp.open("POST","register_validate.php",false);
    

    感谢@Felix Kling 在How do I return the response from an asynchronous call? 的回答

    添加 FALSE 值使函数 SYNCHRONOUS

    【讨论】:

    • 是的,但这会使浏览器在请求完成之前无响应。说真的,不要那样做,去异步并使用回调。
    • @bfavaretto 如果我现在等待的响应只需要很短的时间,我仍然使用它可以吗?
    • 问题是,您无法知道所有用户需要多长时间。
    猜你喜欢
    • 2012-08-14
    • 1970-01-01
    • 2014-06-07
    • 2019-05-26
    • 2015-09-26
    • 1970-01-01
    • 1970-01-01
    • 2018-12-22
    • 2014-09-21
    相关资源
    最近更新 更多