Мобильное взаимодействие в картографических интерфейсах строится поверх абстракции жестов, которая объединяет касания (touch), мышь (mouse) и указательные события (pointer events). В Google Maps JavaScript API эта модель инкапсулирована в систему жестов карты, где базовые операции — перетаскивание, масштабирование, поворот и двойной тап — обрабатываются единым механизмом независимо от типа устройства.
Ключевой принцип: карта не работает напрямую с
touchstart или touchmove как основной API
уровня библиотеки. Вместо этого она преобразует низкоуровневые события
браузера в высокоуровневые жесты.
Внутри движка карты события проходят несколько слоёв:
DOM-события браузера
Слой нормализации Преобразует разные типы ввода в унифицированные жесты.
Gesture Manager Определяет:
API-события Google Maps
dragstart, drag, dragendzoom_changedcenter_changedclick, dblclickidleПоведение тач-событий задаётся через параметры карты:
const map = new google.maps.Map(document.getElementById("map"), {
center: { lat: 50.4501, lng: 30.5234 },
zoom: 10,
gestureHandling: "auto"
});
Основной параметр управления мобильным взаимодействием:
greedy наиболее чувствителен к тач-событиям и часто используется в мобильных интерфейсах.
На мобильных устройствах один жест может порождать несколько событий:
mousedown + clickmousemoveGoogle Maps JavaScript API абстрагирует это в единые события карты,
исключая необходимость ручной обработки touch*.
Иногда требуется обработка касаний на уровне DOM, поверх карты:
const mapDiv = document.getElementById("map");
mapDiv.addEventListener("touchstart", (e) => {
console.log("touchstart on map container");
});
Однако карта может перехватывать события, особенно при
gestureHandling: "greedy".
При работе с оверлеями важно предотвращать «утекание» касаний в карту:
const overlay = document.getElementById("overlay");
overlay.addEventListener("touchmove", (e) => {
e.stopPropagation();
});
Если этого не сделать, карта продолжит обрабатывать жест как pan или zoom.
Маркер генерирует собственные события:
marker.addListener("click", () => {
console.log("marker tapped");
});
На мобильных устройствах:
Информационные окна перехватывают касания внутри своего DOM:
const infoWindow = new google.maps.InfoWindow({
content: "<div>Точка интереса</div>"
});
Касания внутри окна не передаются карте, если не происходит выход за пределы DOM контейнера.
Современные браузеры используют Pointer Events как универсальный слой:
Google Maps JavaScript API не требует ручного управления pointer events, но внутри использует их для унификации ввода.
Особенности:
Мобильные браузеры применяют passive: true к
touch-событиям для повышения производительности. Это означает:
preventDefault()В контексте карты это важно, потому что жесты должны оставаться плавными.
Пример конфликтной ситуации:
mapDiv.addEventListener("touchmove", (e) => {
e.preventDefault(); // может игнорироваться в passive режиме
});
Перетаскивание карты — основной жест:
google.maps.event.addListener(map, "dragstart", () => {
console.log("drag start");
});
google.maps.event.addListener(map, "dragend", () => {
console.log("drag end");
});
На мобильных устройствах:
Жест pinch обрабатывается как изменение zoom:
map.setOptions({
zoomControl: true
});
При pinch:
zoom_changed вызывается после завершения
жестаДолгое касание может использоваться для:
map.addListener("rightclick", (e) => {
console.log(e.latLng.toString());
});
На мобильных устройствах rightclick часто эмулируется
long press.
При обработке жестов ключевой объект — MouseEvent или
MapMouseEvent:
map.addListener("click", (e) => {
console.log(e.latLng.lat(), e.latLng.lng());
});
На тач-устройствах координаты вычисляются из touch point через projection map.
Типичные проблемы:
Решение:
gestureHandling: cooperativeРешение:
stopPropagation() на внутренних элементахРешение:
map.setOptions({
scrollwheel: false
});
При использовании OverlayView тач-события обрабатываются
вручную:
class CustomOverlay extends google.maps.OverlayView {
onAdd() {
this.div = document.createElement("div");
this.div.addEventListener("touchstart", (e) => {
console.log("overlay touch");
});
}
draw() {
const projection = this.getProjection();
}
}
Важно учитывать:
Практические аспекты производительности:
Внутренне система тач-событий в Google Maps JavaScript API строится вокруг трёх уровней:
Эта архитектура позволяет единообразно обрабатывать мобильные и десктопные сценарии без прямой работы с низкоуровневыми touch API.