Как лучше всего обрабатывать независимый клик на одинаковых блоках в разметке DOM?

Например у меня в разметке есть несколько элементов которые ведут себя один в один и у них одинаковые классы

<body>
   <div class="box"><button>Press</button></div>
   <div class="box"><button>Press</button></div>
</body>


я пытался вот так в js сделать
const box = document.querySelectorAll('box');
box.forEach((el) => {
   const btn = el.querySelector('button');
  btn.addEventListener('click', => {
       box.classList.add('active');
    })
});


Но с таким подходом при клике на кнопку по любому из блоков, active класс добавляется всем box блокам.
  • Вопрос задан
  • 36 просмотров
Решения вопроса 1
Stalker_RED
@Stalker_RED
document.addEventListener('click', function(evt) { // всего один EventListener
  const btn = evt.target.closest('.box button');
  if (btn) { // если клик не по кнопке, то в переменной будет null, и этот блок не выполнится.
    btn.closest('.box') // ближайший родительский .box
        .classList.toggle('active');
  }
});
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@Asokr
const box = document.querySelectorAll('box');
box.forEach((el) => {
   const btn = el.querySelector('button');
  btn.addEventListener('click', => {
       this.closest('.box').classList.add('active');
    })
});
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы