脚本仅在警报框位于脚本中时有效

Daq*_*all 2 javascript ajax

如果我从以下脚本中取出警报,那么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>
Run Code Online (Sandbox Code Playgroud)

Ori*_*rds 8

它不起作用的原因是因为它XmlHttpRequest异步的.这意味着,你不能return results;

这是一个时间表,带有警告框:

  1. 创建XmlHttpRequest
  2. 发送
  3. 弹出警报框并在那里停留一段时间
  4. XmlHttpRequest结果返回并resultsonreadystatechange函数中设置变量
  5. 单击警报框上的"确定"
  6. 函数返回(return results行)
  7. 其他代码运行并使用results变量执行操作.

这是没有警报框的时间线:

  1. 创建XmlHttpRequest
  2. 发送
  3. 函数返回(return results行)
  4. 其他代码运行并使用results变量执行操作.这失败了,因为它尚未设置
  5. XmlHttpRequest结果返回并resultsonreadystatechange函数中设置变量

相反,你必须将植物代码(分裂等)放在onreadystatechange回调中,或者将它放在它自己的函数中,并从中调用该函数onreadystatechange