Задать вопрос
@AlexRas

Есть ли разница каким способом добавлять обработчик события в js, конкретно элементу или всему документу, смотря со стороны производительности?

Вот оба варианта:
document.querySelector('button').addEventListener('click', () => {
  alert(1);
});

document.addEventListener('click', (e) => {
  if (e.target.closest('button')) {
    alert(1);
  }
});

Можно ли злоупотреблять вторым вариантом, возможно есть более правильные варианты решения проблемы добавления обработчиков на элементы, которые могут быть на странице, могут не быть или будут добавлены в будущем.

Вот в таком виде:
document.querySelector('button').addEventListener('click', () => {
  alert(1);
});
document.querySelector('button2').addEventListener('click', () => {
  alert(1);
});
document.querySelector('button3').addEventListener('click', () => {
  alert(1);
});

document.addEventListener('click', (e) => {
  if (e.target.closest('button')) {
    alert(1);
  }
});
document.addEventListener('click', (e) => {
  if (e.target.closest('button2')) {
    alert(1);
  }
});
document.addEventListener('click', (e) => {
  if (e.target.closest('button3')) {
    alert(1);
  }
});
  • Вопрос задан
  • 179 просмотров
Подписаться 1 Простой 1 комментарий
Пригласить эксперта
Ответы на вопрос 4
bingo347
@bingo347 Куратор тега JavaScript
Crazy on performance...
Первый вариант предпочтительнее, когда у нас есть один единственный элемент с такой логикой и этот элемент существует на момент добавления обработчика.
Второй вариант предпочтительнее, когда таких элементов много, или когда они появляются динамически.

По перфомансу:
метод closest не бесплатный и здесь он будет вычислятся на любой клик по документу
создание функций тоже не бесплатно, но можно навешивать одну и ту же функцию на множество событий

хотя по последнему моменту, в коде типичной react-макаки будет создаваться по тысяче функций на каждый чих и никто особо не парится (код то работает на девайсах юзера, за оперативку, проц и электричество платят юзеры, а не те кто свои поделия клепает)
Ответ написан
Комментировать
cyber-jet
@cyber-jet
Судя по вопросу есть много одинаковых элементов, например в таблице, тогда первое скорее всего будет выглядеть так:
document.querySelectorAll('button').forEach(el => el.addEventListener('click', () => {
  alert(1);
}));

В первом случае больше затраты на постановку, во втором будет обработчик срабатывать на любом элементе документа. Но как по мне для современных браузеров не особо принципиально, и второй способ удобнее. И если на странице асинхрон, и элементы должны перерисовываться, то в первом случае ещё нужно будет по новой вешать обработчики на новые элементы.
Ответ написан
@artem-dainov
Php, java, js. Boot spring, jquery, git
Голосую за второй вариант и за него веду пропаганду.
И вот почему.
1. Один обработчик для всех кликов на странице.
2. Через условия можно решить как обрабатывать конкретный нажаты элемент.
3. Если интерфейс будет формироваться динамически, то новые обработчики не придется создавать.

А так, наверное делать можно как хочешь.
Ответ написан
402d
@402d
начинал с бейсика на УКНЦ в 1988
Вопрос по моему аналогичен PHPному "какие кавычки быстрее? одинарные или двойные"

Я бы сравнил подходы с удобством отладки кода. Навешанные на дом элемент хуки дебагер может показать, а во втором случае Вам придется самому просматривать ВСЕ навешанные на документ и разбираться какой/какие срабатывают
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы