Popup в Leaflet представляет собой всплывающее окно, привязанное к
карте, маркеру или любому слою, способное отображать HTML-содержимое и
управляться как через высокоуровневые методы слоёв, так и через прямой
API объекта L.Popup.
В Leaflet всплывающие окна реализованы через два основных подхода:
bindPopupL.popupОба подхода используют единый механизм отображения, но различаются уровнем контроля.
bindPopupОсновной способ ассоциации всплывающего окна с объектом слоя:
marker.bindPopup('Текст всплывающего окна');
Также поддерживается HTML:
marker.bindPopup('<b>Заголовок</b><br>Описание');
Расширенная форма с параметрами:
marker.bindPopup('<b>Точка</b>', {
maxWidth: 300,
closeButton: true,
autoClose: true,
className: 'custom-popup'
});
Ключевые особенности:
openPopupautoClose)unbindPopupУдаление привязанного popup:
marker.unbindPopup();
После вызова слой теряет возможность открывать всплывающее окно через стандартные методы.
openPopupОткрытие привязанного popup:
marker.openPopup();
Если popup был создан через bindPopup, он отображается
на карте в позиции слоя.
Для карты:
map.openPopup(popup);
или:
map.openPopup('Текст', latlng);
closePopupЗакрытие текущего открытого popup:
marker.closePopup();
или глобально через карту:
map.closePopup();
const popup = L.popup();
Базовая конфигурация:
const popup = L.popup({
closeButton: true,
autoClose: true,
closeOnClick: true,
className: 'info-popup',
offset: [0, -20]
});
setLatLngУстановка географической позиции:
popup.setLatLng([55.75, 37.61]);
или:
popup.setLatLng(L.latLng(55.75, 37.61));
setContentУстановка содержимого:
popup.setContent('Информация о точке');
HTML поддерживается:
popup.setContent('<div><h3>Объект</h3><p>Описание</p></div>');
openOnОткрытие popup на карте с автоматическим закрытием предыдущих:
popup.setLatLng([55.75, 37.61])
.setContent('Контент')
.openOn(map);
Особенность:
remove и
закрытие popupЗакрытие через карту:
map.closePopup();
или через удаление слоя:
popup.remove();
getPopupВозвращает привязанный popup:
const popup = marker.getPopup();
Если popup отсутствует, возвращается null.
setPopupContentИзменение содержимого без повторного bind:
marker.setPopupContent('Новое содержимое');
isPopupOpenПроверка состояния:
marker.isPopupOpen();
Возвращает true, если popup отображён.
Leaflet предоставляет набор событий для контроля жизненного цикла popup.
popupopenСрабатывает при открытии:
marker.on('popupopen', function (e) {
console.log('Popup открыт');
});
Объект события содержит:
popup — экземпляр L.Popuptarget — слой-источникpopupcloseСрабатывает при закрытии:
marker.on('popupclose', function () {
console.log('Popup закрыт');
});
map.openPopupПрямое открытие:
map.openPopup('Контент', [55.75, 37.61]);
или с объектом:
map.openPopup(popup);
map.closePopupЗакрытие активного popup:
map.closePopup();
При включённом autoClose открытие нового popup приводит
к закрытию предыдущего:
L.popup({ autoClose: true });
Опция closeOnClick управляет закрытием при клике вне
popup:
L.popup({ closeOnClick: true });
Позиционирование относительно точки:
L.popup({ offset: [10, -30] });
Используется для компенсации размеров маркера или визуального выравнивания.
marker.setPopupContent('Обновлённые данные');
if (!marker.isPopupOpen()) {
marker.openPopup();
}
if (marker.isPopupOpen()) {
marker.closePopup();
} else {
marker.openPopup();
}
const popup = L.popup({ closeButton: true });
function showInfo(latlng, text) {
popup
.setLatLng(latlng)
.setContent(text)
.openOn(map);
}
Popup поддерживает полноценный DOM-контент:
marker.bindPopup(`
<div class="popup-card">
<h3>Объект</h3>
<button oncl ick="alert('Действие')">Кнопка</button>
</div>
`);
При этом логика взаимодействия может подключаться через события DOM после открытия:
marker.on('popupopen', () => {
document.querySelector('.popup-card button')
.addEventListener('click', () => {
console.log('Нажатие');
});
});
Leaflet допускает наличие только одного активного popup на карте при
использовании стандартного поведения openOn. Это влияет на
архитектуру интерфейса:
map.openPopup → всегда заменяет активный popupmarker.openPopup → может сосуществовать в рамках слоя,
но подчиняется картеclosePopup → глобальное управление состояниемЛюбой слой, реализующий интерфейс popup, поддерживает:
layer.bindPopup('Контент');
layer.openPopup();
layer.closePopup();
Это распространяется на:
При динамическом изменении карты popup автоматически пересчитывает позицию. Однако при ручном управлении содержимым может применяться:
popup.update();
Используется при изменении DOM внутри уже открытого окна.