Маркер открытия листовки с использованием параметра url теперь не работает, так как используется markercluster

У меня есть листовка на http://atlantaartmap.com. Используемый javascript: http://atlantaartmap.com/lazy_art.js.

В строке 16 я беру параметр URL, который можно использовать для открытия карты на определенном фрагменте. При создании маркеров есть фрагмент кода в строке 71, который проверяет, имеет ли самый последний созданный маркер идентификатор, указанный в URL-адресе.

Раньше этот код работал, но недавно я добавил на сайт кластеры маркеров, и он больше не работает. Он по-прежнему перемещается и приближается к маркеру, но всплывающее окно не открывается. Вот пример.

http://atlantaartmap.com/index.html?piece=40

if (marker.feature.properties.pieceID == pieceID) {
    map.setView(marker.getLatLng(), newZoom());
    marker.openPopup();
}

Я не уверен, почему, но map.setView() работает, а marker.openPopup() — нет.

Любые идеи? Заранее спасибо.


person neelshiv    schedule 12.03.2015    source источник


Ответы (1)


Я предполагаю (я не могу это проверить), что ваша карта все еще масштабируется, пока вы вызываете openPopup на маркере. В то время маркер еще не добавлен на карту из-за вашего кластера, поэтому всплывающее окно не будет отображаться. Вы можете попытаться дождаться завершения метода setView, прослушав событие zoomend, а затем открыть всплывающее окно:

if (marker.feature.properties.pieceID == pieceID) {
    map.setView(marker.getLatLng(), newZoom()).once('zoomend', function () {
        marker.openPopup();
    });
}

Если это не сработает, вы можете попробовать использовать небольшую задержку с setTimeout:

if (marker.feature.properties.pieceID == pieceID) {
    map.setView(marker.getLatLng(), newZoom()).once('zoomend', function () {
        setTimeout(function () {
            marker.openPopup();
        }, 500); // Uses millisecs, you might need to fiddle around with it
    });
}

Другим вариантом может быть ожидание события add маркера:

if (marker.feature.properties.pieceID == pieceID) {
    marker.once('add', function () {
        marker.openPopup();
    });
    map.setView(marker.getLatLng(), newZoom());
}

Надеюсь, это поможет, как я уже сказал, я не могу проверить это из-за сложности вашего случая, поэтому я не уверен. Удачи!

person iH8    schedule 12.03.2015
comment
А, спасибо. У меня мало опыта работы с JS, и я просто предположил, что линия масштабирования будет завершена до того, как она попытается открыть всплывающее окно. Однако у меня было похожее чувство, так как у меня были странные глючные моменты на сгруппированных значках. Позже я опробую некоторые из этих решений и дам вам знать, как идут дела. Спасибо! - person neelshiv; 12.03.2015
comment
Решение Once('add'.. решило проблему, а также является очень ловким трюком. Спасибо! Я посмотрю, смогу ли я найти для него какое-нибудь другое интересное применение. - person neelshiv; 12.03.2015
comment
Приятно слышать, да, в Leaflet много интересного. Никогда не помешает прочитать ссылку: leafletjs.com/reference.html, если у вас есть свободное время. . Удачи с проектом! - person iH8; 12.03.2015
comment
Спасибо. Я прочитал множество руководств по мапбоксам, но я думаю, что чтение более подробной документации листовок — это, вероятно, то, что мне нужно сделать, чтобы перейти на следующий уровень. - person neelshiv; 12.03.2015