Мой проект использует канал JSON для захвата информации о землетрясениях в указанной границе широты и долготы, по существу делая поле. Я беру эту информацию и превращаю все результаты в маркеры на карте Google. Мне нужен каждый маркер, чтобы также отобразить некоторую дополнительную информацию, таким образом, я пытаюсь использовать созданный в объектах InfoWindow, таким образом, что при нажатии на маркер, Вы открываете подсказку с некоторой информацией, связанной с тем маркером. Однако я нахожу, что, какой маркер я нажимаю, тот же infowindow всегда подходит выше того же маркера той группы, и я полагаю, что это всегда - последний infowindow, созданный в моем цикле. Вот код.
$.getJSON(url, function(json) {
for(var i = 0; i < json.earthquakes.length; i++)
{
var pos = new google.maps.LatLng(json.earthquakes[i].lat, json.earthquakes[i].lng);
var info = json.earthquakes[i].lat + ", " + json.earthquakes[i].lng;
var marker = new google.maps.Marker({
map: map,
position: pos,
title: json.earthquakes[i].eqid
})
var tooltip = new google.maps.InfoWindow({
content: info
})
google.maps.event.addListener(marker, 'click', function() {
tooltip.open(map, marker);
});
markers.push(marker);
tooltips.push(tooltip);
}
});
маркерами является массив для всех объектов маркера на карте, и подсказки другой массив для того, чтобы хранить infowindows объекты. Они глобальны.
Это очень распространенный вопрос в теге google-maps и легкая ошибка :)
Происходит то, что ваше событие click вызывается асинхронно, и оно получает текущее значение переменной marker в обратном вызове getJSON (последний в списке).
Вам нужно обернуть вызов addListener в функцию, чтобы вокруг переменной маркера, которая используется в обратном вызове click, было создано закрытие:
function listenMarker (marker)
{
// so marker is associated with the closure created for the listenMarker function call
google.maps.event.addListener(marker, 'click', function() {
tooltip.open(map, marker);
});
}
Затем вызовите listenMarker из основного обратного вызова getJSON (где вы сейчас вызываете addListener).