Настройка макета балуна метки

Open in CodeSandbox

Макеты объектов можно создавать с помощью фабрики templateLayoutFactory, используя текстовые шаблоны.

В данном примере создается пользовательский макет балуна геообъекта. Макет задается геообъекту через опции.

<!DOCTYPE html>

<html>
    <head>
        <title>Настройка макета балуна метки</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&amp;apikey=<ваш API-ключ>"
            type="text/javascript"
        ></script>
        <script
            src="https://yandex.st/jquery/2.2.3/jquery.min.js"
            type="text/javascript"
        ></script>
        <script
            src="placemark_balloon_layout.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 map = new ymaps.Map(
            "map",
            {
                center: [55.650625, 37.62708],
                zoom: 10,
            },
            {
                searchControlProvider: "yandex#search",
            }
        ),
        counter = 0,
        // Создание макета содержимого балуна.
        // Макет создается с помощью фабрики макетов с помощью текстового шаблона.
        BalloonContentLayout = ymaps.templateLayoutFactory.createClass(
            '<div style="margin: 10px;">' +
                "<b>{{properties.name}}</b><br />" +
                '<i id="count"></i> ' +
                '<button id="counter-button"> +1 </button>' +
                "</div>",
            {
                // Переопределяем функцию build, чтобы при создании макета начинать
                // слушать событие click на кнопке-счетчике.
                build: function () {
                    // Сначала вызываем метод build родительского класса.
                    BalloonContentLayout.superclass.build.call(this);
                    // А затем выполняем дополнительные действия.
                    $("#counter-button").bind("click", this.onCounterClick);
                    $("#count").html(counter);
                },

                // Аналогично переопределяем функцию clear, чтобы снять
                // прослушивание клика при удалении макета с карты.
                clear: function () {
                    // Выполняем действия в обратном порядке - сначала снимаем слушателя,
                    // а потом вызываем метод clear родительского класса.
                    $("#counter-button").unbind(
                        "click",
                        this.onCounterClick
                    );
                    BalloonContentLayout.superclass.clear.call(this);
                },

                onCounterClick: function () {
                    $("#count").html(++counter);
                    if (counter == 5) {
                        alert("Вы славно потрудились.");
                        counter = 0;
                        $("#count").html(counter);
                    }
                },
            }
        );

    var placemark = new ymaps.Placemark(
        [55.650625, 37.62708],
        {
            name: "Считаем",
        },
        {
            balloonContentLayout: BalloonContentLayout,
            // Запретим замену обычного балуна на балун-панель.
            // Если не указывать эту опцию, на картах маленького размера откроется балун-панель.
            balloonPanelMaxMapArea: 0,
        }
    );

    map.geoObjects.add(placemark);
}