Google地图标记显示相同的信息

时间:2011-10-12 12:33:38

标签: google-maps google-maps-markers

我知道之前已经提出了类似的问题,但提供的答案并没有解决我的问题。我有一个循环,我遍历地方,创建标记和添加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数组的大小)。

2 个答案:

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