openinfowindowhtml на карте Google после получения информации с сервера - PullRequest
2 голосов
/ 18 сентября 2009

У меня есть карта Google на моем сайте и прикрепите к нему обработчик события moveend

   GEvent.addListener(map, "moveend", function() 
    {
            map.clearovrelays();
            GetLayerDataFromServer(); //it set the markers again on the map  according the map position
    });

а также у меня есть обработчик событий для клика по маркеру

GEvent.addListener(marker, 'click', function()
    { 
        marker.openInfoWindowHtml('this is the data');
    });

Моя проблема в этом

Когда пользователь нажимает на один из маркеров на карте это открывает openInfoWindowHtml соответствующего маркера.

И он также перемещает карту в эту позицию маркера. И тогда это вызывает событие

map.moveend

И на карте событий. Под конец мне все маркеры сбрасываются на карту и перезагрузите их в соответствии с новой позицией карты.

Результатом является то, что Когда пользователь нажимает на маркер, он на секунду открывает его indoWindowHtml и он очищает карту и загружает маркеры снова, без показа indoWindowHtml нажатого маркера.

Мой вопрос: что мне делать, чтобы показать infoWindowHtml?

Ответы [ 3 ]

1 голос
/ 18 сентября 2009

Вы можете установить флаг, который указывает, нажал ли пользователь на маркер, и не очистить карту, если это так.

var marker_clicked = false;

GEvent.addListener(map, "moveend", function() 
{
    if(!marker_clicked)
    {
        map.clearovrelays();
        GetLayerDataFromServer(); //it set the markers again on the map  acording the map position
    }
    marker_clicked = false;
});

GEvent.addListener(marker, 'click', function()
{
    marker_clicked = true;
    marker.openInfoWindowHtml('this is the data');
});
0 голосов
/ 22 сентября 2009

Другой стратегией было бы написать

GEvent.addListener(marker, 'click', function()
    { 
        var iwAnchor = marker.getIcon().infoWindowAnchor;
        var iconAnchor = marker.getIcon().iconAnchor;
        var offset = new GSize(iwAnchor.x-iconAnchor.x,iwAnchor.y-iconAnchor.y);
        map.openInfoWindowHtml(marker.getLatLng(),'this is the data',{pixelOffset:offset});
    });

, а затем вместо вызова clearOverlays () прокручивайте маркеры один за другим, удаляя их.

Открывая информационное окно на карте вместо маркера, оно не закрывается автоматически при удалении маркера.

Информационное окно теперь является наложением, поэтому clearOverlays удаляет его, поэтому вы не можете использовать clearOverlays. Может показаться неэффективным циклически проходить по вашим маркерам, удаляя их один за другим, но clearOverlays выполняет очень похожую петлю внутри.

Вычисления iconAnchor выше просто помещают информационное окно в то же место, которое было бы, если бы вы использовали marker.openInfowindowHtml, а не у подножия маркера.

0 голосов
/ 22 сентября 2009

Одна из возможных альтернативных стратегий состоит в том, чтобы открыть ваше информационное окно с помощью {suppressMapPan: true}, который говорит карте не перемещаться при открытии информационного окна. Таким образом, вы знаете, что любые движения карты являются реальными движениями карты пользователем.

Внимание: {suppressMapPan: true} не документирован, поэтому он может исчезнуть в некоторых будущих выпусках.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...