openinfowindowhtml на карте Google после получения информации с сервера

У меня есть карта 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

А в событии map.moveend я очищаю все маркеры на карте и перезагружаю их в соответствии с новой позицией карты.

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

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


person avi    schedule 18.09.2009    source источник


Ответы (3)


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

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');
});
person Daff    schedule 18.09.2009
comment
хорошо, но я хочу, чтобы GetLayerDataFromServer происходил, потому что я хочу получить маркеры для новых координат карты - person avi; 18.09.2009
comment
@avi: затем переместите GetLayerDataFromServer() за пределы предложения if. - person NickFitz; 18.09.2009

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

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

person Mike Williams    schedule 21.09.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, а не в нижней части маркера.

person Mike Williams    schedule 21.09.2009