在变量中保存XMLHttpRequest.responseText

时间:2011-06-05 15:58:35

标签: php javascript

我正在JS中编写一个小脚本来使用这样的php网站保存数据:

function getPopulation(id) {
    var xhr_object = null;

    if(window.XMLHttpRequest) // Firefox
       xhr_object = new XMLHttpRequest();
    else if(window.ActiveXObject) // Internet Explorer
       xhr_object = new ActiveXObject("Microsoft.XMLHTTP");
    else { // XMLHttpRequest non support? par le navigateur
       alert("Votre navigateur ne supporte pas les objets XMLHTTPRequest...");
       return;
    }

    var url = "http://localhost/inf347/td-svg/population.php?id=1";
    var res = 0;

    xhr_object.open("GET", url,true);
    xhr_object.send(null) ;
    xhr_object.onreadystatechange=function() {
        if (xhr_object.readyState==4) {
                //alert(xhr_object.responseText) ;
                res =   xhr_object.responseText ;
        }
    }
    alert(res);
    //return -1;
}

如果我取消注释行“//alert(xhr_object.responseText);”然后程序打印正确的答案。但是没有办法将该值保存到变量中。 有谁知道如何绕过它?

谢谢, 子

4 个答案:

答案 0 :(得分:2)

“警报(RES);”不会工作,因为浏览器不等待AJAX​​调用完成,它执行整个脚本。如果要对返回的数据执行操作,则需要在xhr_object.onreadystatechange函数中添加回调。

if (xhr_object.readyState==4) {
    //alert(xhr_object.responseText) ;
    res =   xhr_object.responseText ;

    act_on_response(res);
}

代码中的其他地方:

function act_on_response(res)
{
    alert(res);
}

答案 1 :(得分:1)

您必须在

下面提供一个功能名称
 if (httpRequest.status == 200) 
                                       responseData(httpRequest);
                                     else
                                       window.status = httpRequest.statusText;      
                                    }
                                  }

  httpRequest.send(zallInOne); 
}

function responseData(dataFromServer) {
  var d = new Date(); 
  document.getElementById("sha1").style.color = "#ff6000";
  document.getElementById("sha1").value = dataFromServer.responseText;
   ...
  ...
 }

答案 2 :(得分:1)

alertresponseText到达之前触发。您可以使用回调函数,也可以将警报移至statechange函数中。这是因为getPopulation启动了XMLHtpRequest,但它本身并没有等待完成,并且一次执行函数中的所有内容。 readystatechange处理程序同时侦听触发器的操作,但大多数时候触发器在执行调用函数后发生。

// move alert up
if (xhr_object.readyState==4) {
  res =   xhr_object.responseText ;
  alert(res);
}
// use a callback
if (xhr_object.readyState==4) {
  myCallback(xhr_object.responseText);
}
function myCallback(res){
  alert(res);
}

答案 3 :(得分:1)

如果您将响应分配给正确的delcared全局变量,或更新文档的内容,它应该正常工作。

我想问题出在上一个警戒线上。

xhr_object.onreadystatechange=function() {
    if (xhr_object.readyState==4) {
            //alert(xhr_object.responseText) ;
            res =   xhr_object.responseText ;
    }
}
alert(res); // THIS LINE

请注意onreadystatechange是一个回调函数,这意味着在收到响应时将调用此函数。也就是说,该函数是异步调用的。因此,应用程序将继续执行,并且您的警报可以(将)在收到响应之前执行。因此,您将收到一条“0”的警报。