Когда одну и ту же задачу можно выполнить с неизвестным или большим количеством элементов, делегирование событий является лучшим вариантом IMHO.
Что такое делегирование событий?
В двух словах, вы позволяете общему предку справиться с задачей, которую вы в противном случае назначили бы отдельным элементам. например, вместо привязки прослушивателя щелчка к элементам n , вы назначаете его один раз общему предку. ( Подробнее .)
Почему это лучше?
Если вы не будете осторожны, добавив слишком много прослушивателей событий сделает в конечном итоге ухудшает воспринимаемую производительность вашего приложения. Он будет чувствовать себя медлительным sh для ваших пользователей.
Вот что Джон Резиг говорит по этому поводу:
Делегирование событий - эффективный способ следить за событием на большом количестве элементы.
Источник: https://johnresig.com/apps/workshop/adv-talk/index2.html#3
Время демонстрации!
Каждые 2 с добавляю следующее элементы в DOM: (X генерируется)
<div>
<input type="range" id="inpX"/>
<label for="inpX"><!-- SOME DYNAMIC VALUE --></label>
</div>
<label>
будет обновлено, как только пользователь установит диапазон.
Все с точно one слушатель событий!
// set el content to given txt
const write = (el, txt) => el.innerText = txt;
// return the <label> for given id
const label = id => document.querySelector(`label[for="${id}"]`);
// one global event listener - event delegation FTW!
document.body.addEventListener('input', ev => {
const {id, value} = ev.target;
write(label(id), parseInt(value) + 3);
});
<script>
// This code is only for the demo
// It is not part of the answer
function append(n) {
const div = document.createElement('div');
const id = `inp${n}`;
div.innerHTML = `
<input type="range" id="${id}"/>
<label for="${id}"></label>
`;
document.body.appendChild(div);
}
function start() {
let n = Date.now();
append(n++);
start.timer = setInterval(() => append(n++), 2000);
}
function stop() {
clearInterval(start.timer);
}
</script>
<button onclick="start()">START</button>
<button onclick="stop()">STOP</button>
<hr>