0

我试图让 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 不太熟悉,所以“使用 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 回答