2011-04-22 82 views
1

我有一個帶有大約100-150個標記的自定義Google Map的頁面。標記數據是通過外部PHP解析一個XML文件獲得的,該文件是一個事件/項目的列表,但是在每個事件中都是用於創建標記的適當數據。如何在發生時執行異步PHP回聲(JavaScript代碼)?

目前一切正常,但需要一段時間才能加載地圖,因爲解析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); 

還有很長的延遲,那麼地圖和所有標記被繪製,這意味着發送(後到來的的eval()語句)執行所有的回波最後。如何通過project_locations.php來實時執行它們?

+0

我不太瞭解你的問題。上面的代碼片段是使用AJAX調用的文件嗎? – 2011-04-22 05:42:18

+0

我剛剛添加了另一個片段,但是,第一個剪下的代碼將通過AJAX調用(不包括我評論的那3行代碼)。也許我應該重新編碼我知道如何去做,然後看看這裏有沒有人能幫我找到失蹤的一塊。 – Sooie 2011-04-22 05:48:31

+0

@Sooie所以你想要的是在AJAX調用的片段中執行這些行?正確?如果是這種情況,請刪除

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

由於PHP文件基本上是生成Javascript代碼,因此您可以將其作爲Javascript文件包含進來。

有了jQuery,你可以用$.getScript('project_locations.php')做到這一點。它應該是異步的。提示:當您從PHP生成JS變量時,請使用PHP函數json_encode