0

true または false を返す Ajax 関数を取得しようとしています (これは、別の関数から呼び出される一種の検証関数です)。したがって、他の関数は、次に何をすべきかを知るために、この関数から true または false の値を取得する必要があります。

私はこれを以前にやったと確信していますが、今はうまくいきません。onreadystatechange 関数内とその下に戻り値があり、何もない同期呼び出しと非同期呼び出しを試しました。

これはAjaxです:

function saveBooking(){
    var service_ids=document.getElementById("allservice_ids").value;
    var provider_ids=document.getElementById("allprovider_ids").value;
    var chosen_time=document.getElementById("chosen_time").value;
    var chosen_date=document.getElementById("chosen_date").value;
    var message=document.getElementById("message").value;

    var parameters="service_ids="+service_ids+"&provider_ids="+provider_ids+"&time="+chosen_time+"&date="+chosen_date+"&you=<?php echo $_SESSION['user_mail']; ?>&message="+message

     if (window.XMLHttpRequest)
    {// code for IE7+, Firefox, Chrome, Opera, Safari
        xmlhttp=new XMLHttpRequest();
     }
     else
     {// code for IE6, IE5
        xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
     }

     xmlhttp.open("POST","include/save_booking.php",true);
     xmlhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded")
     xmlhttp.onreadystatechange = function() {//Call a function when the state changes.
        if(xmlhttp.readyState == 4 && xmlhttp.status == 200) {
            var yesorno=xmlhttp.responseText;
            if(yesorno=="ok"){
                return true;
            }
            else{
                document.getElementById("booking_error").innerHTML = xmlhttp.responseText;
                return false;               
            }
         }
     }
     xmlhttp.send(parameters);

   }

現在、save_booking.php には行が含まれているだけですが<?php echo "ok"; ?>、テスト目的でその行に縮小しました。

誰かがこれを機能させる方法を教えてもらえますか? 他の関数では、これを行うと:

if(saveBooking()){
        alert(saveBooking());
     }

「未定義」という単語を警告するだけです。

私は jQuery にあまり詳しくないので、「jQuery を使用してください」という回答は役に立たないことに注意してください。

4

1 に答える 1

1

現在のreturnステートメントは、onreadystatchangeメソッドが返すものを決定するだけで、処理されません(間違っている場合は訂正してください。少なくとも、戻り値にアクセスする方法がわかりません)。あなたが望むのは、のリターンに影響を与えることですsaveBooking、それであなたはこのようなことをすることができます:

 var responseOk = false;
 xmlhttp.onreadystatechange = function() {//Call a function when the state changes.
    if(xmlhttp.readyState == 4 && xmlhttp.status == 200) {
        responseOk = (xmlhttp.responseText=="ok");
        if(!responseOk) {
            document.getElementById("booking_error").innerHTML = xmlhttp.responseText;
        }
     }
 }
 ...
 return responseOk;

ちなみに、jQueryを避けたい特別な理由がない限り(たとえば、私は個人的に最初に自分で物事を行うことを学ぶのが好きです)、それを確認することを強くお勧めします。それはあなたにとって複雑になることはなく、物事をはるかに簡単にします。

これとは別に、MilkyWayJoeのコメントをサポートする必要があります。非同期HTTPリクエストを生成して、その戻り値を待つ必要があるのはあまり意味がありません。現時点ではfalse、スクリプトがreturnステートメントに到達するまでにリクエストが終了していないため、上記の例はおそらくほとんどの場合に返されます。リクエストを行う関数とリクエストのコールバックを混同しないことは理にかなっています。

于 2012-04-24T16:00:24.123 に答える