События в Mapbox GL JS представляют собой механизм взаимодействия с картой и её состоянием. Они позволяют реагировать на действия пользователя, изменения данных, завершение отрисовки, загрузку ресурсов и внутренние процессы рендеринга. Архитектура событий построена по модели, схожей с DOM Events, но адаптирована под WebGL-контекст карты.
Все события регистрируются через методы экземпляра карты:
map.on('тип-события', handler);
map.off('тип-события', handler);
map.once('тип-события', handler);
Каждое событие передаёт объект события, структура которого зависит от его типа, но часто включает информацию о координатах, слоях, источниках данных и состоянии карты.
События Mapbox GL JS можно разделить на несколько крупных категорий:
Такая классификация отражает внутреннюю архитектуру карты: от источников данных до финального кадра WebGL.
События этого типа возникают при работе пользователя с картой. Они привязаны к координатам, пикселям и объектам слоёв.
clickdblclickmousedownmouseupmousemovemouseentermouseleavemouseovermouseoutcontextmenuПример регистрации события клика:
map.on('click', (e) => {
console.log(e.lngLat);
});
Объект события содержит ключевые поля:
lngLat — географические координаты точкиpoint — экранные координаты (x, y)originalEvent — нативное DOM-событиеfeatures — объекты слоёв, попавшие под курсор (если
используется queryRenderedFeatures)События можно привязывать к конкретным слоям:
map.on('click', 'cities-layer', (e) => {
console.log(e.features);
});
Поддерживаемые типы аналогичны базовым pointer-событиям:
click, mouseenter, mouseleave,
mousemove.
Это позволяет реализовывать интерактивные карты без ручного поиска объектов.
На мобильных устройствах используются сенсорные события, которые Mapbox GL JS абстрагирует:
touchstarttouchendtouchcancelОднако большинство жестов (zoom, rotate, pitch) не требуют прямой обработки touch-событий, поскольку управляются встроенными контроллерами карты.
События состояния отражают жизненный цикл карты и её готовность к работе.
loadСрабатывает один раз после полной загрузки стиля и всех необходимых ресурсов.
map.on('load', () => {
console.log('карта готова');
});
removeВызывается при удалении карты из DOM:
map.on('remove', () => {
console.log('карта уничтожена');
});
idleСрабатывает, когда карта завершила все операции рендеринга и загрузки:
map.on('idle', () => {
console.log('карта в состоянии покоя');
});
Эти события отражают процесс отрисовки WebGL-сцены.
renderstartВозникает при начале нового цикла рендеринга.
renderСрабатывает на каждом кадре рендеринга. Может вызываться многократно в секунду.
map.on('render', () => {
console.log('кадр отрисован');
});
renderendВозникает после завершения текущего цикла рендеринга.
Рендер-события особенно важны при создании анимаций и синхронизации внешних интерфейсов с картой.
Mapbox GL JS активно работает с векторными и растровыми тайлами, поэтому события загрузки данных являются ключевыми.
dataСрабатывает при изменении состояния любого источника данных.
sourcedataСобытие, связанное с конкретным source:
map.on('sourcedata', (e) => {
console.log(e.sourceId);
});
dataloadingВозникает при начале загрузки данных.
styledataloadingСрабатывает при загрузке стиля или его частей.
Источники (sources) имеют собственный жизненный цикл
загрузки:
События позволяют отслеживать состояние каждого слоя данных независимо.
map.on('data', (e) => {
if (e.sourceId === 'cities') {
console.log('обновились данные cities');
}
});
errorУниверсальное событие для всех типов ошибок:
map.on('error', (e) => {
console.error(e.error);
});
Объект ошибки обычно содержит:
error.messageerror.statuserror.sourceId (если применимо)В обработчиках событий this указывает на экземпляр
карты:
map.on('load', function () {
this.addSource(...);
});
Метод once используется для одноразового
реагирования:
map.once('load', () => {
console.log('выполнится один раз');
});
function handler(e) {
console.log(e);
}
map.on('click', handler);
map.off('click', handler);
Если обработчик не указан, удаляются все слушатели данного события.
События не всегда изолированы: одно действие пользователя может порождать цепочку событий.
Пример при клике:
mousedownmouseupclickrenderdata при запросе объектовПонимание этой цепочки важно для прогнозирования поведения интерфейса.
Слои в Mapbox GL JS имеют собственную модель интерактивности. При наличии нескольких слоёв под курсором события обрабатываются в порядке z-index.
map.on('click', (e) => {
const features = map.queryRenderedFeatures(e.point);
});
Каждый объект feature содержит:
layergeometrypropertiessourceХотя они не относятся напрямую к pointer-событиям, они критически важны для интерактивности:
movestartmovemoveendzoomstartzoomzoomendrotatestartrotaterotateendpitchstartpitchpitchendЭти события позволяют отслеживать трансформации камеры карты.
map.on('move', () => {
console.log(map.getCenter());
});
Каждое изменение состояния карты инициирует перерасчёт сцены:
Это приводит к цепочке:
move/zoom/pitch → renderstart → render → renderend → idle
Такая модель обеспечивает предсказуемую синхронизацию состояния карты и графического вывода.