我有一个自定义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回应?
答案 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
。