Попытка связать несколько InfoWindows с несколькими Маркерами на Google Map и сбое

Мой проект использует канал 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 объекты. Они глобальны.

12
задан Kara 30 December 2013 в 07:35
поделиться

1 ответ

Это очень распространенный вопрос в теге 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).

20
ответ дан 2 December 2019 в 05:54
поделиться
Другие вопросы по тегам:

Похожие вопросы: