Ответ 1
Чтобы выполнить делегирование событий изначально:
parent.addEventListener('click', function(e) {
if(e.target.classList.contains('myclass')) {
// this code will be executed only when elements with class
// 'myclass' are clicked on
}
});
Эффективность, о которой вы говорите, связана с тем, сколько добавляемых обработчиков событий. Представьте таблицу со 100 строками. Гораздо эффективнее присоединить один обработчик события к элементу таблицы, а затем "делегировать" каждой строке, чем присоединить 100 обработчиков событий, 1 к каждой строке.
Делегирование событий причины объясняется тем, что событие click на самом деле срабатывает как для дочернего, так и для родительского (потому что вы нажимаете на область внутри родителя). Вышеприведенный фрагмент кода запускается в родительском клик-событии, но выполняется только тогда, когда условие возвращает true для события target, таким образом имитируя непосредственно подключенный обработчик событий.
Bubbling/capture - связанная проблема, но вам нужно только беспокоиться об этом, если порядок нескольких обработчиков событий срабатывает. Я рекомендую читать далее порядок событий, если вы заинтересованы в понимании барботажа против захвата.
Наиболее распространенным преимуществом делегирования событий является то, что он обрабатывает новые элементы, которые добавляются в DOM после присоединения обработчика события. Возьмите приведенный выше пример таблицы из 100 строк с обработчиками кликов. Если мы используем привязку обработчика прямых событий (100 обработчиков событий), то новые добавляемые строки потребуют добавления обработчиков событий вручную. Если мы будем использовать делегированные события, то новые строки будут автоматически "иметь" обработчик событий, поскольку он технически был добавлен к родительскому элементу, который будет отображать все будущие события. Прочитайте Что такое DOM Event Delegation, как предположил Феликс Клинг, для получения дополнительной информации.