Собственный макет балуна кластера
В данном примере создается собственный макет контента балуна кластера.
Макет задается опцией 'clusterBalloonContentLayout'.
Макеты объектов можно создавать с помощью фабрики templateLayoutFactory, используя текстовые шаблоны.
Текстовые шаблоны формируют html-содержимое макета на основе хэша с данными, передаваемого в конструктор макета.
В данном примере поставщиком данных является кластер, у которого был открыт балун.
В макете происходит перечисление и вывод полей 'placemarkId' и 'balloonContentHeader' всех геообъектов кластера при помощи конструкции 'for'.
Макет задается опцией 'clusterBalloonContentLayout'.
Макеты объектов можно создавать с помощью фабрики templateLayoutFactory, используя текстовые шаблоны.
Текстовые шаблоны формируют html-содержимое макета на основе хэша с данными, передаваемого в конструктор макета.
В данном примере поставщиком данных является кластер, у которого был открыт балун.
В макете происходит перечисление и вывод полей 'placemarkId' и 'balloonContentHeader' всех геообъектов кластера при помощи конструкции 'for'.
index.html
cluster_custom_balloon_content_layout.js
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<html>
<head>
<title>Собственный макет балуна кластера</title>
<meta
http-equiv="Content-Type"
content="text/html; charset=UTF-8"
/>
<script
src="https://yandex.st/jquery/2.2.3/jquery.min.js"
type="text/javascript"
></script>
<!--
Укажите свой API-ключ. Тестовый ключ НЕ БУДЕТ работать на других сайтах.
Получить ключ можно в Кабинете разработчика: https://developer.tech.yandex.ru/keys/
-->
<script
src="https://api-maps.yandex.ru/2.1/?lang=ru_RU&apikey=<ваш API-ключ>"
type="text/javascript"
></script>
<script
src="cluster_custom_balloon_content_layout.js"
type="text/javascript"
></script>
<style>
html,
body {
margin: 0;
padding: 0;
}
html,
body,
#map {
width: 100%;
height: 100%;
}
.list {
list-style: none outside;
margin: 0;
padding: 0;
}
.list li {
padding-bottom: 10px;
}
.list a {
color: #207697;
}
.list a:hover {
color: #28b8f0;
text-decoration: none;
}
</style>
</head>
<body>
<div id="map"></div>
</body>
</html>
</html>
jQuery(function () {
ymaps.ready(function () {
var mapCenter = [55.755381, 37.619044],
map = new ymaps.Map("map", {
center: mapCenter,
zoom: 10,
controls: [],
}),
placemarks = [];
// Создаем собственный макет с информацией о выбранном геообъекте.
var customBalloonContentLayout =
ymaps.templateLayoutFactory.createClass(
[
"<ul class=list>",
// Выводим в цикле список всех геообъектов.
"{% for geoObject in properties.geoObjects %}",
'<li><a href=# data-placemarkid="{{ geoObject.properties.placemarkId }}" class="list_item">{{ geoObject.properties.balloonContentHeader|raw }}</a></li>',
"{% endfor %}",
"</ul>",
].join("")
);
jQuery(document).on("click", "a.list_item", function () {
// Определяем по какой метке произошло событие.
var selectedPlacemark =
placemarks[jQuery(this).data().placemarkid];
alert(selectedPlacemark.properties.get("balloonContentBody"));
});
var clusterer = new ymaps.Clusterer({
clusterDisableClickZoom: true,
clusterOpenBalloonOnClick: true,
// Устанавливаем режим открытия балуна.
// В данном примере балун никогда не будет открываться в режиме панели.
clusterBalloonPanelMaxMapArea: 0,
// По умолчанию опции балуна balloonMaxWidth и balloonMaxHeight не установлены для кластеризатора,
// так как все стандартные макеты имеют определенные размеры.
clusterBalloonMaxHeight: 200,
// Устанавливаем собственный макет контента балуна.
clusterBalloonContentLayout: customBalloonContentLayout,
});
// Заполняем кластер геообъектами со случайными позициями.
for (var i = 0, l = 100; i < l; i++) {
var placemark = new ymaps.Placemark(getRandomPosition(), {
// Устаналиваем данные, которые будут отображаться в балуне.
balloonContentHeader: "Заголовок метки №" + (i + 1),
balloonContentBody: "Информация о метке №" + (i + 1),
placemarkId: i,
});
placemarks.push(placemark);
}
clusterer.add(placemarks);
map.geoObjects.add(clusterer);
function getRandomPosition() {
return [
mapCenter[0] + (Math.random() * 0.3 - 0.15),
mapCenter[1] + (Math.random() * 0.5 - 0.25),
];
}
clusterer.balloon.open(clusterer.getClusters()[0]);
});
});