Информационные окна в HERE Maps JavaScript API представляют собой интерактивные всплывающие контейнеры, привязанные к географическим объектам карты и предназначенные для отображения контекстной информации о маркерах, объектах и пользовательских элементах. В экосистеме HERE Technologies они реализованы через UI-компоненты и низкоуровневые классы карты, позволяющие гибко управлять содержимым, стилями и поведением окна.
Основная роль информационных окон заключается в связывании визуального слоя карты с динамическими данными: описаниями объектов, результатами поиска, пользовательскими метками, атрибутами POI и произвольной HTML-разметкой.
В JavaScript API HERE Maps чаще всего используется класс:
H.ui.InfoBubble — высокоуровневое UI-окноH.map.InfoBubble — низкоуровневый объект карты (в
некоторых конфигурациях)Информационное окно строится вокруг трёх ключевых компонентов:
Пример логики инициализации:
const bubble = new H.ui.InfoBubble(
{ lat: 52.5, lng: 13.4 },
{
content: '<div>Информация об объекте</div>'
}
);
ui.addBubble(bubble);
Контент задаётся как строка HTML, что обеспечивает гибкость отображения, но требует контроля за безопасностью и производительностью.
Наиболее распространённый формат — HTML-строка. Он позволяет формировать сложные интерфейсы внутри окна:
content: `
<div class="info-window">
<h3>Объект на карте</h3>
<p>Описание объекта с дополнительными данными.</p>
</div>
`
Ключевая особенность заключается в том, что API не ограничивает структуру HTML, поэтому разработчик полностью контролирует визуальное представление.
Контент часто генерируется на основе данных маркера:
marker.addEventListener('tap', (evt) => {
const data = evt.target.getData();
const bubble = new H.ui.InfoBubble(evt.target.getGeometry(), {
content: `
<div>
<strong>${data.title}</strong>
<div>${data.description}</div>
</div>
`
});
ui.addBubble(bubble);
});
Такой подход используется при интеграции с API геокодинга, маршрутизации и внешними REST-сервисами.
Вместо строки можно использовать DOM-ноды, что полезно при сложных интерфейсах:
const container = document.createElement('div');
container.innerHTML = '<button>Действие</button>';
const bubble = new H.ui.InfoBubble(position, {
content: container
});
Это позволяет интегрировать информационные окна с приложением без ограничения HTML-строкой.
Информационные окна чаще всего связываются с маркерами
(H.map.Marker) или объектами
(H.map.Object).
marker.addEventListener('tap', function (evt) {
const coord = evt.target.getGeometry();
const bubble = new H.ui.InfoBubble(coord, {
content: 'Маркер выбран'
});
ui.addBubble(bubble);
});
Важный момент: окно привязывается к координате, а не к DOM-элементу маркера.
Информационные окна часто требуют корректировки позиции относительно маркера:
const bubble = new H.ui.InfoBubble(coord, {
content: 'Текст',
offset: new H.math.Point(0, -20)
});
Это предотвращает перекрытие маркера и улучшает читаемость.
Информационные окна не управляются автоматически — их необходимо удалять вручную:
ui.removeBubble(bubble);
При работе с множеством объектов обычно используется стратегия «одно окно на карту»:
if (currentBubble) {
ui.removeBubble(currentBubble);
}
currentBubble = bubble;
Контент может изменяться без пересоздания окна:
bubble.setContent('<div>Новые данные</div>');
Это важно при асинхронной подгрузке информации (fetch/AJAX).
Информационные окна имеют встроенные стили, но допускают переопределение через CSS:
Пример переопределения:
.h-ui-infobubble {
border-radius: 8px;
font-family: Arial, sans-serif;
}
Особое внимание уделяется стрелке (tail), которая указывает на объект карты. Её стилизация требует аккуратного изменения псевдоэлементов.
Информационные окна могут содержать полноценные UI-элементы:
Пример обработчика внутри окна:
container.querySelector('button').addEventListener('click', () => {
console.log('Кнопка нажата');
});
Важно учитывать, что события внутри окна работают в контексте DOM, а не карты.
Одновременное отображение нескольких информационных окон возможно, но требует контроля:
Часто применяется стратегия агрегации:
При интенсивной работе с окнами важно учитывать:
Оптимизационные подходы:
Так как контент часто формируется динамически, возникает риск XSS:
Особенно критично при интеграции с внешними API и пользовательским вводом.
Информационные окна часто используют отложенную загрузку:
const bubble = new H.ui.InfoBubble(coord, {
content: 'Загрузка...'
});
fetch('/api/object')
.then(res => res.json())
.then(data => {
bubble.setContent(`<div>${data.name}</div>`);
});
Это позволяет отображать окно мгновенно, а данные подгружать позже.
При zoom и pan информационные окна автоматически пересчитывают позицию:
Это обеспечивает согласованность отображения с картографическим слоем.
UI-слой карты отвечает за управление окнами:
В типичной архитектуре:
H.Map — картаH.ui.UI — UI-менеджерInfoBubble — элемент отображенияТакое разделение позволяет отделять данные карты от интерфейса взаимодействия.