如果我从以下脚本中取出警报调用, 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>
最佳答案
它不起作用的原因是 XmlHttpRequest
是异步。这意味着您不能返回结果;
这是一个带有提醒框的时间表:
- 创建 XmlHttpRequest
- 发送
- 弹出警告框并在那里停留一段时间
- XmlHttpRequest 结果返回并在您的
onreadystatechange
函数中设置results
变量 - 您点击警告框上的“确定”
- 函数返回(
return results
行) - 其他代码运行并使用
results
变量执行操作。
这是没有警告框的时间线:
- 创建 XmlHttpRequest
- 发送
- 函数返回(
return results
行) - 其他代码运行并使用
results
变量做事。这失败了,因为它还没有被设置 - XmlHttpRequest 结果返回并在您的
onreadystatechange
函数中设置results
变量
相反,您必须将植物代码(拆分等)放在 onreadystatechange
回调中,或者将其放在它自己的函数中,然后从 onreadystatechange
调用该函数
关于javascript - 脚本仅在警报框位于脚本中时才有效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2142682/