0

重複の可能性:
関数からの AJAX 呼び出しからの応答を返す方法は?

このコードに問題があります。

この関数が 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>
4

2 に答える 2

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();
    }
}
于 2013-01-19T02:07:41.677 に答える
0

false を追加することで解決される問題

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

非同期呼び出しからの応答を返すにはどうすればよいですか?での @Felix Kling による回答に感謝します。

FALSE 値を追加して関数を SYNCHRONOUS にする

于 2013-01-19T02:12:46.427 に答える