如果我从以下脚本中取出警报,那么firebug说结果是未定义的?`
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<title>Inventory Management</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<title>Untitled Document</title>
<script src="json.js" type="text/javascript"></script>
<script src="prototype.js" type="text/javascript"></script>
</head>
<body>
<div id="content">
<div id="header">
</div>
<script type="text/javascript">
var xhr;
var results=getPlants(xhr,results);
var plants=[];
function getPlants(xhr,results){
try {
xhr=new XMLHttpRequest();
}catch(microsoft){
try{
xhr=new ActiveXObject("Msxml2.XMLHTTP");
}catch(othermicrosoft){
try{
xhr = new ActiveXObject("Microsoft.XMLHTTP");
}catch(failed){
xhr=false;
alert("ajax not supported");
}
}
}
xhr.onreadystatechange= function () {
if(xhr.readyState==4 && xhr.status==200) {
results = xhr.responseText;
}
}
xhr.open("GET","db_interactions.php",true);
xhr.send(null);
alert("sent");
return results;
}
plants.inv=[];
plants.split = results.split("~");
for (var x=0;x<=plants.split.length-2;x++){
plants.inv[x]=plants.split[x].evalJSON();
}
document.write(plants.inv[1].scientific_name);
</script>
</div>
</body>
</html>
答案 0 :(得分:8)
它不起作用的原因是因为XmlHttpRequest
是异步。这意味着您不能执行return results;
这是一个时间表,带有提示框:
results
函数中设置onreadystatechange
变量return results
行)results
变量运行并执行操作。这是没有警告框的时间轴:
return results
行)results
变量执行操作。这是因为尚未设置而失败results
函数中设置onreadystatechange
变量相反,你必须将植物代码(分裂等)放在onreadystatechange
回调中,或者将它放在它自己的函数中,然后从onreadystatechange
答案 1 :(得分:2)
您应该修改分配给onreadystatechange属性的回调函数中的plants
变量。
xhr.onreadystatechange = function(){
if(xhr.readyState==4 && xhr.status==200) {
results = xhr.responseText;
// Populate the "plants" variable here, then call a function
// that does something with the plants variable.
}
}
有关详细信息:https://developer.mozilla.org/en/AJAX/Getting_Started
答案 2 :(得分:1)
致电时
xhr.open("GET","db_interactions.php",true);
您告诉XMLHttpRequest以异步方式运行 。你告诉它去完成它的工作,在完全处理请求后,在将来某个未指定的时间调用回调函数。将true
更改为false
,它会按预期运行。另一方面,如果网络速度减慢等,该功能可能无限期挂起,因此警告程序。
答案 3 :(得分:1)
设置'results'变量的回调函数是异步的 - 意味着它可能会在 return语句之后设置,除非有什么东西可以延迟return语句(例如alert()呼叫)。
答案 4 :(得分:0)
XMLHttpRequest.send()是异步的。没有警报,该函数比ajax调用运行得更快,结果永远不会被初始化。您可以通过将公开调用中的true
更改为false
以使其同步或在内联函数中设置全局变量来解决此问题