Javascript谷歌地图从xml数据创建标记
-我有这段代码,我正在Mozilla上测试它。这段代码应该在地图上做大量的标记。我在XML文件中有标记的纬度和经度。当它运行它时,它会将浏览器冻结几秒钟,只做15个标记。控制台说这个递归太多了。我还尝试使用forvar I=0;iJavascript谷歌地图从xml数据创建标记,javascript,xml,google-maps,Javascript,Xml,Google Maps,-我有这段代码,我正在Mozilla上测试它。这段代码应该在地图上做大量的标记。我在XML文件中有标记的纬度和经度。当它运行它时,它会将浏览器冻结几秒钟,只做15个标记。控制台说这个递归太多了。我还尝试使用forvar I=0;i
var map;
var i =0;
var xmldoc=loadXMLDoc("skoly.xml");
var x= xmldoc.getElementsByTagName("skoly");
var image = {url: 'images/blackmarker.png',
anchor: new google.maps.Point(0, 10)};
function loop(){
createMarker(function(){loop();});
}
function createMarker(callback) {
var location =new google.maps.LatLng (xmldoc.getElementsByTagName("gps_latitude")[i].childNodes[0].nodeValue,xmldoc.getElementsByTagName("gps_longitude")[i].childNodes[0].nodeValue);
var marker = new google.maps.Marker({
position: location,
map:map,
icon: image
});
i++;
if(i < x.length)callback();
}
function initialize() {
var startlatlng = new google.maps.LatLng(49.8037633,15.4749126,7);
var mapOptions = {
zoom: 7,
center: startlatlng
}
map = new google.maps.Map(document.getElementById('map_canvas'), mapOptions);
loop();
}
google.maps.event.addDomListener(window, 'load', initialize);
带有for循环的代码:
var map;
var xmldoc=loadXMLDoc("skoly.xml");
var x= xmldoc.getElementsByTagName("skoly");
var image = {url: 'images/blackmarker.png',
anchor: new google.maps.Point(0, 10)};
function createMarker(i) {
var location =new google.maps.LatLng (xmldoc.getElementsByTagName("gps_latitude")[i].childNodes[0].nodeValue,xmldoc.getElementsByTagName("gps_longitude")[i].childNodes[0].nodeValue);
var marker = new google.maps.Marker({
position: location,
map:map,
icon: image
});
}
function initialize() {
var startlatlng = new google.maps.LatLng(49.8037633,15.4749126,7);
var mapOptions = {
zoom: 7,
center: startlatlng
}
map = new google.maps.Map(document.getElementById('map_canvas'), mapOptions);
for(var i =0;i < x.length;i++){createMarker(i);}
}
google.maps.event.addDomListener(window, 'load', initialize);
XML文件看起来像:
<DocumentElement>
<skoly>
<stuff1>someting</stuff1>
<stuff2>something</stuff2>
<gps_latitude>49,2816216</gps_latitude>
<gps_longitude>15,4402835</gps_longitude>
</skoly>
<skoly>
.
.
</skoly>
</DocumentElement>
循环和createMarker函数是相互递归的,这意味着它们相互调用
如果我们去掉Google Maps代码,简化循环函数,并重命名回调参数,您可以更清楚地看到这一点:
function loop() {
createMarker(loop);
}
function createMarker(loop) {
i++;
if(i < x.length) loop();
}
loop调用createMarker,createMarker反过来调用loop–直到它在x集合结束时触底。调用堆栈的大小将是x的两倍,这会在集合较大时导致太多递归错误
在这种情况下,for循环应该工作得更好,但我们需要查看for循环代码,可能还有XML文件,以了解它失败的原因。这很有帮助,谢谢。在XML文件的lat/long坐标中将逗号改为句点,这样就可以开始了。