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

时间:2010-01-26 21:12:37

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

5 个答案:

答案 0 :(得分:8)

它不起作用的原因是因为XmlHttpRequest异步。这意味着您不能执行return results;

这是一个时间表,带有提示框:

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

    1. 创建XmlHttpRequest
    2. 发送
    3. 函数返回(return results行)
    4. 其他代码运行并使用results变量执行操作。这是因为尚未设置而失败
    5. XmlHttpRequest结果返回并在results函数中设置onreadystatechange变量
    6. 相反,你必须将植物代码(分裂等)放在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以使其同步或在内联函数中设置全局变量来解决此问题