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

标签 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>

最佳答案

它不起作用的原因是 XmlHttpRequest异步。这意味着您不能返回结果;

这是一个带有提醒框的时间表:

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

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

  1. 创建 XmlHttpRequest
  2. 发送
  3. 函数返回(return results 行)
  4. 其他代码运行并使用 results 变量做事。这失败了,因为它还没有被设置
  5. XmlHttpRequest 结果返回并在您的onreadystatechange 函数中设置results 变量

相反,您必须将植物代码(拆分等)放在 onreadystatechange 回调中,或者将其放在它自己的函数中,然后从 onreadystatechange 调用该函数

关于javascript - 脚本仅在警报框位于脚本中时才有效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2142682/

相关文章:

javascript - 更改所有链接的颜色

javascript - 在每个换行符中删除字符后的字符串

javascript - 如何在knockoutjs按钮点击事件中添加Google AdWords转化跟踪代码?

javascript - select2 4.0 AJAX 预填充方法?

javascript - jqGrid SetCell 和 SaveCell 在关闭模态对话框后清空单元格

javascript - 使用 jquery 解析 JSON 响应中的项目

javascript - Asp net core——从模型到javascript

php - 在 PHP 中检测 Ajax 并确保请求来 self 自己的网站

javascript - 通过 POST 或 cookie 发送 token ?

javascript - 改进AJAX响应处理功能