如何在发生异步PHP回声(JavaScript代码)时执行它们?

时间:2011-04-22 05:31:33

标签: php javascript ajax echo

我有一个自定义Google地图的页面,其中包含大约100到150个标记。标记数据是通过外部PHP解析XML文件获得的,该文件是事件/项目列表,但在每个事件中都是创建标记的适当数据。

目前一切正常,但加载地图需要一段时间,因为解析XML文件需要一些时间。为了加快速度,我基本上想要通过在页面加载时绘制空白地图来动态加载页面,然后运行外部PHP文件以使用AJAX异步解析XML并将标记添加到地图中,因为它们是从异步中回显的。 PHP循环。

我不知道怎么做就是在它们到来时执行这些回声。

包含地图的页面(explore.php)运行JavaScript:

 <script type="text/javascript">;
        function init() {
            // Draw the map (blank)
            var map_focus = new google.maps.LatLng(35,-37);
            var myOptions = { zoom: 2,center: map_focus,mapTypeId: google.maps.MapTypeId.ROADMAP };  
            var map = new google.maps.Map(document.getElementById("map_canvas"), myOptions);
            var xmlhttp = new XMLHttpRequest();
            // Run PHP to parse XML, asynchronously
            xmlhttp.open("GET","project_locations.php",true);
            xmlhttp.send();
            // This is where I want the JS/AJAX to execute echoes as they come from the above call to project_locations.php
            eval(xmlhttp.responseText);
        }
        // Add marker to map. Markers would appear as fast as the XML is parsed
        function addMarker(object, name, id) {
            google.maps.event.addListener(object,"click", function() {
                window.location = "showproject.php?id=" + id;
            });
        }
    </script>

这是project_locations.php:

include('spparser.php'); // Parse XML
$i = 0;
foreach(SPParser::search($_REQUEST) as $index=>$sp) {
    if ($sp["latitude"] != '' && $sp["longitude"] != '') {
        echo "var marker" . $i . "= new google.maps.Marker({\n";
            echo "position: new google.maps.LatLng(" . $sp["latitude"] . ", " . $sp["longitude"] . "),\n";
            echo "map: map,\n";
            echo "icon: 'http://www.google.com/intl/en_us/mapfiles/ms/micons/" . $sp["color"] . "-dot.png',\n";
            echo "title: \"" . $sp["name"] . "\"\n";
        echo "});\n\n";
        echo "addMarker(marker" . $i . ", \"" . $sp["name"] . "\", " . $sp["id"] . ");\n";
        $i++;
    }
}   

上面的代码绘制了一张空白地图,就是这样。但是,如果我使用以下方式同步运行它:

xmlhttp.open("GET","project_locations.php",false);

有一个很长的延迟,然后绘制地图和所有标记,这意味着send()之后的eval()语句在结束时执行所有回声。我如何实时执行它们,因为它们被project_locations.php回应?

3 个答案:

答案 0 :(得分:1)

您可以使用jQuery Ajax执行异步HTTP(Ajax)请求。

你可以做的就是创建一个简单的HTML文件并编写你的JavaScript函数,它会在一段超时时间之后调用服务器方法,或者在循环中调用它或者递归你的函数,无论你喜欢什么。我能看到你问题的工作样本吗?这样我可以更好地帮助你?

答案 1 :(得分:0)

原因是脚本完成执行后将返回响应文本 为了获取下载数据,您可以将响应文本作为其下载来获取。

while(true)
   {
    xmlhttp.onreadystatechange=function() //listens to the state chnages
   {
    if(xmlhttp.readyState==3) //if its still loading
     {
      eval(xmlhttp.responseText);
     }
   }

    if(xmlhttp.readyState==4) { eval(xmlhttp.responseText);} break; //finished loading get out of for loop
   }

还要确保php不会缓冲任何输出。就像你的文件一样。

@ini_set('zlib.output_compression',0);
@ini_set('implicit_flush',1);
@ob_end_clean();

ob_implicit_flush(1);

答案 2 :(得分:0)

由于PHP文件基本上是生成Javascript代码,因此您可以将其作为Javascript文件包含。

使用jQuery,您可以使用$.getScript('project_locations.php')执行此操作。它应该是异步的。

提示:当您从PHP生成JS变量时,请使用PHP函数json_encode