我正在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);”然后程序打印正确的答案。但是没有办法将该值保存到变量中。 有谁知道如何绕过它?
谢谢, 子
答案 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)
alert
在responseText
到达之前触发。您可以使用回调函数,也可以将警报移至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”的警报。