Делегирование событий — это подход, при котором обработчик событий устанавливается на родительский элемент, а не на каждый дочерний. Такой метод повышает производительность при работе с большим количеством элементов и упрощает динамическое добавление элементов на страницу.
u('#container').on('click', 'button', function(event) {
console.log('Кнопка нажата:', this.textContent);
});
'#container' — родительский элемент, на котором
регистрируется событие.'click' — тип события.'button' — селектор дочерних элементов, на которые
будет распространяться обработка.this внутри функции ссылается на дочерний
элемент, на который кликнули.event.target. В делегировании
this уже корректно указывает на элемент-мишень. Внутри
обработчика можно использовать методы Umbrella JS для работы с этим
элементом:u('#container').on('click', '.item', function() {
u(this).toggleClass('active');
});
Здесь toggleClass меняет состояние конкретного дочернего
элемента, сохраняя обработчик на родителе.
Umbrella JS позволяет регистрировать обработку сразу нескольких событий на одном элементе. Например:
u('#list').on('click mouseover', 'li', function(event) {
if(event.type === 'click') {
u(this).toggleClass('selected');
} else if(event.type === 'mouseover') {
u(this).addClass('hovered');
}
});
on можно передавать несколько событий через
пробел.event.type.Селектор должен быть точным Umbrella JS проверяет соответствие дочерних элементов селектору в момент события. Чем сложнее селектор, тем больше затрат на вычисления.
Неподдерживаемые события Некоторые события,
например focus или blur, не всплывают.
Делегирование для них нужно организовывать через
focusin/focusout:
u('#form').on('focusin', 'input', function() {
u(this).addClass('focused');
});
this всегда дочерний элемент
Даже если событие назначено на родителя, внутри обработчика
this — элемент, соответствующий селектору, а не
родитель.Пример: список с динамическими элементами
u('#add-item').on('click', function() {
u('#list').append('<li class="item">Новый элемент</li>');
});
u('#list').on('click', '.item', function() {
u(this).toggleClass('highlight');
});
#add-item добавляет новые элементы в
список.li, не
добавляя отдельный обработчик для каждого.Пример: обработка всех кнопок в модальном окне
u('#modal').on('click', 'button', function(event) {
switch(this.dataset.action) {
case 'save':
console.log('Сохраняем данные');
break;
case 'close':
u('#modal').hide();
break;
}
});
data-action для определения типа
кнопки.this всегда указывает на элемент-мишень, а не на
родителя.focus, следует
использовать всплывающие аналоги (focusin).Делегирование — ключевой инструмент при работе с динамическими интерфейсами и большими DOM-структурами, полностью поддерживаемый Umbrella JS и реализуемый с минимальным количеством кода.