我知道之前已经提出了类似的问题,但提供的答案并没有解决我的问题。我有一个循环,我遍历地方,创建标记和添加eventlisteners。当我点击之后的任何标记后,它们都会显示相同的信息。
var geocoder;
var map;
function initialize() {
// Load places from xml file
if (window.XMLHttpRequest)
{// code for IE7+, Firefox, Chrome, Opera, Safari
xmlhttp=new XMLHttpRequest();
}
else
{// code for IE6, IE5
xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
}
xmlhttp.open("GET","person_city_clause.xml",false);
xmlhttp.send();
xmlDoc=xmlhttp.responseXML;
var text =
xmlDoc.getElementsByTagName("text");
var places = [];
var descriptions = [];
for (var i=3; i<text.length; i++)
{
places.push(text[i].childNodes[0].nodeValue); // place
descriptions[places[i]] = descriptions.push(text[i-2].childNodes[0].nodeValue); // person
i=i+3;
}
// Create inital Google Map
var latlng = new google.maps.LatLng(-34.397, 150.644);
var myOptions = {
zoom: 2,
center: latlng,
mapTypeId: google.maps.MapTypeId.ROADMAP
};
var map = new google.maps.Map(document.getElementById("map_canvas"), myOptions);
// fill map with place markers
geocoder = new google.maps.Geocoder();
var infowindow = new google.maps.InfoWindow();
var marker = [];
for (var i=0; i<places.length; i++)
{
geocoder.geocode( { 'address': places[i]}, function(results, status)
{
if (status == google.maps.GeocoderStatus.OK)
{
marker[i] = new google.maps.Marker({
map: map,
position: results[0].geometry.location});
listenMarker(marker[i], results[0].formatted_address );
}
})
}
function listenMarker(marker, place)
{
google.maps.event.addListener(marker, 'click', function(){
infowindow.setContent("" + place);
infowindow.open(map, this);});
}
}
编辑:当我在geocoder.geocode之后发出警报(i)时,我总是得到32(places数组的大小)。
答案 0 :(得分:1)
你需要一个infowindows数组,如果不这样做,infowindow变量会被下一个标记覆盖..
所有这些内容都是相同的。
编辑:只需创建另一个全局数组:
var locations = [];
..code blabla
if(status == google.maps.GeocoderStatus.OK)
{
for(int k = 0; k<results.length;k++{
locations.push = results[k].geometry.location;
}
}
您可以使用以下方法遍历此数组:
for(int i=0; i<locations.length;i++)
{
}
答案 1 :(得分:0)
尝试在函数的上下文中设置局部变量,从而创建事件函数:
...
var index = i;
if (status == google.maps.GeocoderStatus.OK) {
...
infowindow.setContent("" + index);