Делегирование событий — это техника обработки событий, при которой слушатель навешивается не на каждый элемент отдельно, а на общий контейнер. Это позволяет уменьшить количество обработчиков, улучшить производительность и упростить управление динамически создаваемыми элементами.
В JavaScript событие распространяется по фазе всплытия. Это означает, что событие, вызванное на вложенном элементе, сначала запускает обработчики на нём, а затем поднимается к родительским элементам. Делегирование использует этот принцип: вместо того чтобы навешивать обработчик на каждый элемент, он навешивается на родительский контейнер.
Пример без делегирования:
u('.item').on('click', function() {
console.log('Клик на элементе');
});
Если элементов .item много (например, сотни или тысячи),
это создаёт значительную нагрузку на память и
производительность, поскольку создаётся отдельный обработчик
для каждого элемента.
Пример с делегированием:
u('#container').on('click', '.item', function(event) {
console.log('Клик на элементе через делегирование');
});
Здесь обработчик добавляется только один раз на контейнер
#container. Umbrella JS автоматически проверяет, совпадает
ли цель события с селектором .item, и вызывает функцию
только при клике на нужный элемент.
Umbrella JS упрощает делегирование через метод
.on():
u(parentSelector).on(eventType, childSelector, callback)
Параметры:
parentSelector — контейнер, на который навешивается
обработчик.eventType — тип события (click,
input, change и др.).childSelector — CSS-селектор дочерних элементов, на
которые реально реагируем.callback — функция, которая выполняется при
событии.При срабатывании события Umbrella JS проверяет, соответствует ли
event.target указанному селектору, и вызывает callback
только если условие выполнено.
Обычное навешивание обработчиков на элементы, которые создаются после
загрузки страницы, не работает, потому что такие элементы ещё не
существуют в момент вызова .on(). Делегирование решает эту
проблему автоматически:
u('#list').on('click', '.list-item', function(event) {
console.log('Новый элемент тоже реагирует на клик');
});
Любой .list-item, добавленный позже в
#list, будет автоматически подчиняться делегированному
обработчику.
Использование делегирования уменьшает количество слушателей событий и снижает нагрузку на DOM, особенно при большом числе элементов:
Однако есть нюансы:
focus,
blur), нельзя делегировать напрямую. Для таких случаев
используются специальные методы или обёртки.event.target.Пример использования event.target и
event.currentTarget:
u('#menu').on('click', 'li', function(event) {
console.log('Целевой элемент:', event.target);
console.log('Контейнер делегирования:', event.currentTarget);
});
event.target показывает элемент, на котором произошло
событие, а event.currentTarget — элемент, на котором
установлен делегированный обработчик (#menu).
Делегирование хорошо сочетается с методами манипуляции DOM в Umbrella JS:
u('#tasks').on('click', '.task', function(event) {
u(event.target).toggleClass('completed');
});
.task, созданный позже, получает функциональность
автоматически.Делегирование событий в Umbrella JS — это не только способ повышения производительности, но и метод упрощения поддержки динамических интерфейсов, позволяющий управлять большим количеством элементов через единый контейнер.