Обработчики событий в HERE Technologies и JavaScript API карты HERE Maps API for JavaScript являются ключевым механизмом взаимодействия пользователя с картографическим интерфейсом. Через события реализуются клики по объектам, перемещения карты, масштабирование, работа с маркерами, пользовательские жесты и множество других сценариев, формирующих интерактивность геоприложений.
Событийная модель основана на подписке (event-driven architecture).
Каждый объект карты способен генерировать события, а разработчик —
подписываться на них через методы addEventListener или
специализированные методы API.
Основные принципы:
Базовый синтаксис:
map.addEventListener('eventType', function (event) {
// обработка события
});
Удаление:
map.removeEventListener('eventType', handler);
Каркас интерактивности формируют события самого объекта карты.
mapviewchange — изменение состояния отображения
карты;mapviewchangeend — завершение изменения вида;pointerdown — нажатие на карту;pointerup — отпускание указателя;tap — одиночный клик/тап;dbltap — двойной клик;dragstart, drag, dragend —
перетаскивание карты;wheel — масштабирование колесом мыши.Пример обработки перемещения карты:
map.addEventListener('mapviewchange', (event) => {
const center = map.getCenter();
const zoom = map.getZoom();
console.log('Центр карты:', center);
console.log('Масштаб:', zoom);
});
Указательные события являются базовым уровнем взаимодействия и включают как мышь, так и сенсорные устройства.
Используются для отслеживания начала и окончания взаимодействия:
map.addEventListener('pointerdown', (evt) => {
console.log('Нажатие в координатах:', evt.currentPointer.viewportX, evt.currentPointer.viewportY);
});
Абстрактные события, объединяющие мышь и touch-интерфейс:
map.addEventListener('tap', (evt) => {
const geoPoint = map.screenToGeo(
evt.currentPointer.viewportX,
evt.currentPointer.viewportY
);
console.log('Координаты клика:', geoPoint);
});
Перемещение карты управляется цепочкой событий:
dragstart — начало движения;drag — активное перемещение;dragend — завершение.Пример контроля движения:
map.addEventListener('dragstart', () => {
console.log('Начало перемещения карты');
});
map.addEventListener('drag', (evt) => {
console.log('Перемещение...', evt.currentPointer);
});
map.addEventListener('dragend', () => {
console.log('Перемещение завершено');
});
Масштабирование происходит через колесо мыши или жесты:
wheel — изменение масштаба колесом;mapviewchange — отражает итоговое изменение zoom.Пример:
map.addEventListener('wheel', (evt) => {
console.log('Изменение масштаба колесом');
});
Контроль уровня масштабирования:
map.addEventListener('mapviewchangeend', () => {
console.log('Текущий zoom:', map.getZoom());
});
Маркеры, полигоны и линии обладают собственной системой событий.
Маркер реагирует на пользовательские действия:
tappointerenterpointerleavemarker.addEventListener('tap', (evt) => {
console.log('Маркер нажат');
});
marker.addEventListener('pointerenter', () => {
console.log('Курсор над маркером');
});
marker.addEventListener('pointerleave', () => {
console.log('Курсор покинул маркер');
});
При работе с векторными слоями события часто связаны с выборкой объектов.
dataLayer.addEventListener('tap', (evt) => {
const target = evt.target;
const data = target.getData();
console.log('Выбран объект:', data);
});
События позволяют реализовать:
Каждое событие содержит унифицированный объект с информацией:
Основные поля:
type — тип события;target — объект-источник;currentPointer — данные указателя;timestamp — время события.Пример анализа события:
map.addEventListener('tap', (evt) => {
console.log(evt.type);
console.log(evt.timestamp);
});
Одна из ключевых задач — преобразование координат:
map.addEventListener('tap', (evt) => {
const geo = map.screenToGeo(
evt.currentPointer.viewportX,
evt.currentPointer.viewportY
);
console.log('Геокоординаты:', geo.lat, geo.lng);
});
Обратное преобразование:
const screenPoint = map.geoToScreen({ lat: 52.5, lng: 13.4 });
Для оптимизации производительности важно управлять подписками.
function onTap(evt) {
console.log('tap');
}
map.addEventListener('tap', onTap);
map.removeEventListener('tap', onTap);
map.addEventListener('tap', handler, { once: true });
При работе с множеством объектов используется делегирование:
map.addEventListener('tap', (evt) => {
if (evt.target instanceof H.map.Marker) {
console.log('Клик по маркеру');
}
});
Такой подход снижает нагрузку на систему и упрощает архитектуру.
Сенсорные устройства объединяют жесты:
Унификация событий позволяет использовать один обработчик для всех платформ.
При работе с большим количеством событий важно учитывать:
Пример оптимизации:
map.addEventListener('pointermove', throttle((evt) => {
console.log(evt.currentPointer);
}, 50));