Google Maps API v3 — все маркеры используют одно и то же информационное окно

Я копался везде, и я не могу понять это. Это сводит меня с ума! Я новичок в javascript в целом, поэтому я не могу понять перевод, который решит мою проблему. Я заметил, что у многих людей есть эта проблема, но все они, похоже, используют более сложный (или просто запутанный) код, чем я. В любом случае, поехали!

У меня возникла проблема, когда все мои маркеры имеют один и тот же контент.

function initialize() {
var myOptions = {
    center: new google.maps.LatLng(34.151271, -118.449537),
    zoom: 9,
    mapTypeId: google.maps.MapTypeId.ROADMAP,
    mapTypeControl: false,
    streetViewControl: false,
    panControl: false,
    zoomControl: true,
    zoomControlOptions: { style: google.maps.ZoomControlStyle.SMALL },
};

var map = new google.maps.Map(document.getElementById("map_canvas"), myOptions);

setMarkers(map, clubs);

}

var clubs = [
['Poop', 34.223868, -118.601575, 'Dookie'],
['Test Poop', 34.151271, -118.449537, 'Test Business']
];

function setMarkers(map, locations) {
var image = new google.maps.MarkerImage('images/image.png',
    new google.maps.Size(25, 32),
    new google.maps.Point(0,0),
    new google.maps.Point(0, 32)
);
var shape = {
coord: [1, 1, 1, 20, 18, 20, 18 , 1],
type: 'poly'
};
for (var i = 0; i < locations.length; i++) {
var club = locations[i];
var myLatLng = new google.maps.LatLng(club[1], club[2]);
var infowindow = new google.maps.InfoWindow();
var marker = new google.maps.Marker({
    position: myLatLng,
    map: map,
    icon: image,
    shape: shape,
    title: club[0],
});
google.maps.event.addListener(marker, 'click', function(){
    infowindow.setContent(club[3]);
    infowindow.open(map, this);
});
}
}

Я знаю, что я дрянной, но кто-нибудь, пожалуйста, помогите мне! :П


person Mikey    schedule 28.02.2012    source источник


Ответы (2)


Проблема в том, что вы настраиваете прослушиватель событий для щелчка маркера внутри цикла. Таким образом, все маркеры в конечном итоге получают содержимое только для последнего из ваших маркеров. Попробуйте это вместо этого. Создайте новую глобальную функцию:

function bindInfoWindow(marker, map, infowindow, html) {
    marker.addListener('click', function() {
        infowindow.setContent(html);
        infowindow.open(map, this);
    });
} 

Затем в вашем цикле замените это:

google.maps.event.addListener(marker, 'click', function(){
    infowindow.setContent(club[3]);
    infowindow.open(map, this);
});

с этим:

// add an event listener for this marker
bindInfoWindow(marker, map, infowindow, club[3]); 
person duncan    schedule 28.02.2012
comment
Спасибо Дункан! Работает красиво и заняло 2 секунды, чтобы исправить. Ты мужчина! - person Mikey; 03.03.2012
comment
@duncan Большое спасибо! - person Saurabh R S; 09.07.2015
comment
Привет, ребята, это решение также сработало для меня, большое спасибо. Однако я хотел бы понять, почему это работает так, а не иначе? Мы по-прежнему привязываем слушателя к циклу, однако теперь этот код заключен в функцию. Почему это имеет значение? Спасибо! - person WPalombini; 25.11.2015
comment
@WPalombini Таким образом вы убедитесь, что прослушиватель событий каждого маркера использует именно тот текст, который вы хотите отображать каждый раз. С другой стороны, вы по-прежнему прикрепляете прослушиватель событий к каждому маркеру, однако содержимое информационного окна просто исходит из того, что есть у club[3], в то время, когда вы щелкаете маркер. Это будет просто то, что есть в конце цикла. - person duncan; 25.11.2015
comment
Спасибо! Долго искал решение, этот простой код решил и мою проблему! - person NVO; 15.08.2016

При установке объекта маркера (var marker = new ...) измените эту строку: "title: club[0]" на "title: club[i]". Да, просто измените 0 на i.

Это должно решить проблему.

Попробуйте эту ссылку для учебника по Google Maps API с примерами.

http://code.google.com/apis/maps/documentation/javascript/tutorial.html

Это должно быть очень легко и полезно.

person Yaztown    schedule 28.02.2012
comment
Когда я попытался заменить «0» на «i», мой последний маркер был удален, и все они стали бесполезными. «0» относится к имени моего маркера. - person Mikey; 03.03.2012