2012-04-24 3 views
0

Я пытаюсь получить функцию Ajax для возврата 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» не является полезным ответом для меня.

+0

Несмотря на это, используйте jQuery. Если вы можете понять этот гигантский кусок кода, jquery займет у вас около 7 минут, чтобы понять его полностью. Не пытайтесь быть мудрым парнем, но jquery устранит МНОГО вашего письменного кода, а также путаницу и ошибки. – Dutchie432

+0

Откройте Firebug, перейдите на вкладку NET и посмотрите свой HTTP-ответ. –

+0

вместо возврата true .. попробуйте переменную и предупредите, если еще что-то другое. Просто для тестирования – zod

ответ

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

+0

Да, его необходимо определить локально в объеме 'saveBooking', иначе он будет недоступен (если вы не сделаете его глобальным, опуская' var'). – Armatus

+0

Я собирался что-то написать, прежде чем вы отредактировали :) – MilkyWayJoe

Смежные вопросы