Подписка на события dom-элемента

Open in CodeSandbox

Dom-элементы могут генерировать на себе различные типы событий в зависимости от браузера и устройства. Например, при наведении мышкой на объект может быть сгенерировано событие 'mousedown', а при нажатии на элемент пальцем на экране планшета - событие 'touchstart'. API Яндекс.Карт преобразует различные события браузеров в единый список событий. Таким образом, вы можете писать один и тот же код по обработке dom-событий во всех браузерах и устройствах, которые поддерживаются API.

Список событий, которыми оперирует API, и схему преобразования событий можно посмотреть в описании интерфейса IDomEventEmitter. Подписываться на события dom-элементов можно с помощью domEvent.manager.

<!DOCTYPE html>

<html>
    <head>
        <title>Подписка на события dom-элемента</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="dom_event_manager.js" type="text/javascript"></script>
        <style type="text/css">
            body {
                font-family: Arial;
                font-size: 14px;
            }

            #myElement {
                height: 200px;
                width: 200px;
                display: flex;
                align-items: center;
                justify-content: center;
                font-size: 200px;
                cursor: default;
            }
        </style>
    </head>
    <body>
        <h3>Погладь кота!</h3>
        <div id="myElement">🐈</div>
        <button id="clear">Очистить</button>
        <div id="log"></div>
    </body>
</html>
ymaps.ready(init);

function init() {
    // Даже если пользователь коснется элемента на экране планшета, такие события, как
    // 'touchstart', 'touchmove' и прочие, будут преобразованы в единый список событий.
    // Это позволяет писать кроссплатформенный код и не задумываться о типе устройства.
    var targetElement = document.getElementById("myElement"),
        events = ["mouseenter", "mouseleave", "click", "dblclick", "wheel"],
        divListeners = ymaps.domEvent.manager
            .group(targetElement)
            .add(events, function (event) {
                log(event.get("type"));
            });

    document.getElementById("clear").onclick = function () {
        document.getElementById("log").innerHTML = "";
    };

    window.log = function (message) {
        document.getElementById("log").innerHTML =
            document.getElementById("log").innerHTML + "<br>" + message;
    };
}