Обработка событий на объектах в ObjectManager
ObjectManager - класс, позволяющий добавить на карту большое количество объектов без необходимости создавать метки по отдельности.
Объекты, добавленные в ObjectManager, располагаются в коллекции ObjectManager.objects. Кластеры, образованные из добавленных меток, добавляются в коллекцию ObjectManager.clusters. Визуальное отображение меток создается по требованию асинхронно. Визуальным отображением меток и кластеров являются объекты, реализующие интерфейс IOverlay. В частности, overlay.Placemark. Оверлеи помещаются в коллекции ObjectManager.objects.overlays и ObjectManager.clusters.overlays соответственно.
События на оверлеях объектов пропагируются в родительские коллекции. В событии в поле objectId передается уникальный идентификатор объекта, на котором произошло событие. Идентификаторы для одиночных объектов задаются пользователем, а для кластеров генерируются автоматически при создании.
<!DOCTYPE html>
<html>
<head>
<title>Обработка событий на объектах в ObjectManager</title>
<meta
http-equiv="Content-Type"
content="text/html; charset=utf-8"
/>
<!--
Укажите свой 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="https://yandex.st/jquery/2.2.3/jquery.min.js"
type="text/javascript"
></script>
<script
src="object_manager_events.js"
type="text/javascript"
></script>
<style>
html,
body,
#map {
width: 100%;
height: 100%;
padding: 0;
margin: 0;
}
</style>
</head>
<body>
<div id="map"></div>
</body>
</html>
ymaps.ready(init);
function init() {
var myMap = new ymaps.Map(
"map",
{
center: [55.76, 37.64],
zoom: 10,
},
{
searchControlProvider: "yandex#search",
}
),
objectManager = new ymaps.ObjectManager({
// Чтобы метки начали кластеризоваться, выставляем опцию.
clusterize: true,
geoObjectOpenBalloonOnClick: false,
clusterOpenBalloonOnClick: false,
});
myMap.geoObjects.add(objectManager);
$.ajax({
url: "data.json",
}).done(function (data) {
objectManager.add(data);
});
function onObjectEvent(e) {
var objectId = e.get("objectId");
if (e.get("type") == "mouseenter") {
// Метод setObjectOptions позволяет задавать опции объекта "на лету".
objectManager.objects.setObjectOptions(objectId, {
preset: "islands#yellowIcon",
});
} else {
objectManager.objects.setObjectOptions(objectId, {
preset: "islands#blueIcon",
});
}
}
function onClusterEvent(e) {
var objectId = e.get("objectId");
if (e.get("type") == "mouseenter") {
objectManager.clusters.setClusterOptions(objectId, {
preset: "islands#yellowClusterIcons",
});
} else {
objectManager.clusters.setClusterOptions(objectId, {
preset: "islands#blueClusterIcons",
});
}
}
objectManager.objects.events.add(
["mouseenter", "mouseleave"],
onObjectEvent
);
objectManager.clusters.events.add(
["mouseenter", "mouseleave"],
onClusterEvent
);
}