2012-04-24 6 views
0

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

私はこれまでこれをやったことがあると確信していますが、今は動作させることができません。私は同期と非同期の呼び出しを試み、onreadystatechange関数の中に戻り、その下に何もない。

これはアヤックスである:今

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にあまり慣れていないので、 'use jQuery'は私にとって有益な回答ではありません。

+0

でも、jQueryを使用してください。この巨大なコードを理解できれば、jqueryは完全に理解するまでに約7分かかります。賢明な人にしようとはしませんが、jqueryは混乱とエラーだけでなく、あなたの手書きコードの多くを取り除きます。 – Dutchie432

+0

Firebugを開き、NETタブをクリックしてHTTP応答を見てください。返す代わりに –

+0

真実..いくつかの変数を試して、それ以外の場合には警告してください。ちょうどテストのため – zod

答えて

1

現在のreturnステートメントは、onreadystatchangeメソッドが返すものだけを判別します。これは処理されません(私が間違っている場合は修正してください - 少なくとも戻り値にアクセスする方法はわかりません)。私は個人的に行うことを学ぶのが好きあなたはjQueryのを避けたい理由はいくつかの特別な理由(例えばありますしない限り、ところで

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; 

:何が欲しいのは、あなたがこのような何かを行うことができますので、saveBookingのリターンに影響を与えることがあります私自身、最初に自分のことを考えます)、私はあなたがそれを見てみることを強く勧めます。それはあなたのために複雑になることはありませんし、物事をはるかに簡単になります。

私はMilkyWayJoeのコメントをサポートしなければなりません。非同期HTTPリクエストを生成して戻り値を待つ必要はありません。現時点では、上記の例はおそらく、ほとんどの場合、スクリプトがreturnステートメントに到着するまでに要求が完了していないので、falseを返します。要求を行う関数と要求のコールバックが混在しないようにしてください。

+0

私は同様のことを試しましたが、変数を参照するときにonreadystatechange関数の外でresponseOkという名前を付けると、定義されていないというエラーが表示されます。私はそれを関数の中で宣言していましたが、それは問題であったかもしれません。 – jovan

+0

はい、 'saveBooking'のスコープでローカルに定義する必要があります。そうでなければ、' var'を省略してグローバルにしない限り、そこでは使用できません。 – Armatus

+0

あなたが編集する前に私はそれについて何か書きたいと思っていました:) – MilkyWayJoe

関連する問題