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


How to execute asynchronous PHP echoes (JavaScript code) as they occur?

我有一个带有自定义谷歌地图的页面,其中有大约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()语句执行最后的所有echo。我如何实时执行它们,因为它们是由project_locations.php响应?

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

确切地说,你可以做的是,创建一个简单的HTML文件,并在那里编写你的JavaScript函数,该函数将在一些超时时间后调用服务器方法,或者在循环或递归中调用它,无论你喜欢哪个。我可以看一下你们问题的样品吗?好让我更好地帮你吗?

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

使用jQuery,您可以在$.getScript('project_locations.php')中做到这一点。它应该是异步的

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

原因是当脚本执行完成时将返回响应文本要在下载时获取数据,您必须在下载时获取响应文本。

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);