В Google Maps JavaScript API используется событийно-ориентированная модель взаимодействия, основанная на регистрации обработчиков и их последующем вызове при изменении состояния объектов карты. Почти все интерактивные элементы карты — сама карта, маркеры, полигоны, линии, информационные окна — генерируют события, позволяя строить сложную логику без постоянного опроса состояния.
События делятся на две ключевые категории:
Основной механизм подписки реализован через пространство имён
google.maps.event.
Базовый способ работы с событиями — функция
addListener.
const map = new google.maps.Map(document.getElementById("map"), {
center: { lat: 50.45, lng: 30.52 },
zoom: 10
});
const listener = google.maps.event.addListener(map, "center_changed", () => {
console.log("Центр карты изменился:", map.getCenter().toString());
});
Каждый вызов addListener возвращает объект слушателя,
который можно использовать для удаления обработчика.
google.maps.event.removeListener(listener);
Удаление слушателей критично для предотвращения утечек памяти, особенно в SPA-приложениях, где карта может создаваться и уничтожаться многократно.
Для сценариев, где обработчик должен сработать только один раз,
используется addListenerOnce.
google.maps.event.addListenerOnce(map, "tilesloaded", () => {
console.log("Плитки карты загружены");
});
После первого вызова обработчик автоматически удаляется.
Google Maps JavaScript API предоставляет богатый набор событий, связанных с состоянием карты:
center_changed — изменение центра картыzoom_changed — изменение уровня масштабаbounds_changed — изменение видимой областиmap.addListener("zoom_changed", () => {
console.log("Zoom:", map.getZoom());
});
Часто эти события срабатывают многократно при анимации, поэтому их использование требует оптимизации (например, debounce).
idle — карта завершила все анимации и загрузкуtilesloaded — загружены тайлы картыmap.addListener("idle", () => {
console.log("Карта стабилизировалась");
});
idle является ключевым для логики, связанной с загрузкой
данных по текущей области карты.
clickdblclickrightclickmousemovedragstart, drag, dragendmap.addListener("click", (event) => {
console.log("Клик по карте:", event.latLng.toString());
});
Объект event обычно содержит:
latLng — координаты точкиpixel — экранные координаты (в некоторых событиях)Маркер является одним из наиболее часто используемых объектов API и поддерживает собственные события:
clickdragstartdragdragendmouseovermouseoutconst marker = new google.maps.Marker({
position: { lat: 50.45, lng: 30.52 },
map,
draggable: true
});
marker.addListener("dragend", (event) => {
console.log("Новая позиция:", event.latLng.toString());
});
Перетаскиваемые маркеры генерируют поток событий, позволяющий отслеживать движение в реальном времени.
Объекты типа Polyline, Polygon,
Rectangle, Circle также поддерживают
события:
clickmousemoverightclickconst polygon = new google.maps.Polygon({
paths: [
{ lat: 50.1, lng: 30.1 },
{ lat: 50.2, lng: 30.2 },
{ lat: 50.3, lng: 30.1 }
],
map
});
polygon.addListener("click", (event) => {
console.log("Клик по полигону:", event.latLng.toString());
});
Для сложных картографических интерфейсов события геометрии используются для редактирования областей и построения интерактивных редакторов.
Информационные окна поддерживают ограниченный набор событий:
closeclickdomreadyconst infoWindow = new google.maps.InfoWindow({
content: "<div>Информация</div>"
});
infoWindow.addListener("domready", () => {
console.log("InfoWindow готов к работе");
});
Событие domready особенно важно для манипуляции DOM
внутри окна.
В Google Maps JavaScript API события не всегда всплывают в привычном DOM-смысле. Например:
Для построения сложной логики требуется явное управление маршрутизацией событий.
google.maps.eventСтарый, но до сих пор активно используемый механизм:
addListeneraddListenerOnceremoveListenerclearInstanceListenerstriggergoogle.maps.event.trigger(map, "resize");
Метод trigger позволяет искусственно генерировать
события, что используется при интеграции с внешними UI-компонентами.
Хотя API не предоставляет полноценной системы кастомных событий,
можно имитировать её через trigger:
google.maps.event.addListener(map, "custom_event", (data) => {
console.log("Кастомное событие:", data);
});
google.maps.event.trigger(map, "custom_event", {
type: "manual",
payload: 123
});
Такой подход применяется для синхронизации модулей в сложных приложениях.
При работе с динамическими интерфейсами важно контролировать привязанные обработчики:
clearInstanceListenersgoogle.maps.event.clearInstanceListeners(map);
Это удаляет все подписки объекта и предотвращает накопление неиспользуемых обработчиков.
Событийная система тесно связана с производительностью интерфейса:
mousemove и drag могут генерироваться
десятки раз в секундуОсобенно критичны события:
bounds_changedcenter_changedzoom_changedИх частота может резко возрастать при анимациях карты.
События часто используются как триггеры загрузки данных:
idlemap.addListener("idle", async () => {
const bounds = map.getBounds();
await fetchData(bounds);
});
Такой подход позволяет связывать визуальную часть карты с внешними источниками данных без постоянного polling-механизма.