2012-04-24 171 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()); 
    } 

它只是提醒單詞'undefined'。

請注意,我不太熟悉jQuery,所以'使用jQuery'對我來說不是一個有用的迴應。

+0

即便如此,請使用jQuery。如果你能理解這個巨大的代碼塊,jquery將花費大約7分鐘的時間來充分理解。不要試圖成爲一個聰明人,但jQuery會消除你手寫代碼的很多,以及混淆和錯誤 – Dutchie432 2012-04-24 15:55:53

+0

打開Firebug,單擊NET選項卡,並觀看您的HTTP響應。 – 2012-04-24 15:57:31

+0

而不是返回true ..嘗試一些變量,並警告如果其他本身..只是爲了測試 – zod 2012-04-24 16:02:13

回答

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語句時請求未完成。不要混淆發出請求的函數和請求的回調。

+0

我想類似的東西,但是當我引用您的名字responseOk的onreadystatechange的功能以外的變量,我得到一個錯誤,說這是不確定的。我在函數中聲明它,但我發現這可能是問題所在。 – jovan 2012-04-24 16:02:27

+0

是的,它需要在saveBooking'的'範圍本地定義,否則將不可用有(除非你把它的全球省略'var')。 – Armatus 2012-04-24 16:03:58

+0

在編輯之前,我正要寫些關於它的東西:) – MilkyWayJoe 2012-04-24 16:09:50

相關問題