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

Как написать это с одним циклом?

const elem = document.querySelectorAll('.box');

for (let i = 0; i < elem.length; i++) {
  elem[i].addEventListener('click', function () {
    for (let x = 0; x < elem.length; x++) {
      elem[x].style.background = 'black';
    }

    elem[i].style.background = 'red';
  })
}
  • Вопрос задан
  • 392 просмотра
Подписаться 1 Простой 1 комментарий
Решения вопроса 2
0xD34F
@0xD34F Куратор тега JavaScript
О каких элементах идёт речь: const selector = '.box';.

Вместо назначения индивидуальных обработчиков каждому элементу можно сделать один делегированный:

document.addEventListener('click', ({ target: t }) => {
  if (t = t.closest(selector)) {
    for (const n of document.querySelectorAll(selector)) {
      n.style.background = n === t ? 'red' : 'black';
    }
  }
});

или

.box        { background: black; }
.box.active { background:   red; }

document.addEventListener('click', function({ target: t }) {
  if (t = this.find(n => n.contains(t))) {
    this.forEach(n => n.classList.toggle('active', n === t));
  }
}.bind([...document.querySelectorAll(selector)]));

ИЛИ

При обработке клика вместо перебора всех элементов можно получить тот, состояние которого необходимо сбросить, собрав соответствующий ему селектор:

document.querySelectorAll(selector).forEach(function(n) {
  n.addEventListener('click', this);
}, function() {
  document.querySelector(`${selector}.active`)?.classList.remove('active');
  this.classList.add('active');
});
Ответ написан
twobomb
@twobomb
.box{
  background:black;
}
.box.active{
  background:red;
}

const elem = document.querySelectorAll('.box');

for (let i = 0; i < elem.length; i++) 
  elem[i].addEventListener('click', function (evt) {
    var el = document.querySelector('.box.active');
    if(el)
    	el.classList.remove("active");
     evt.target.classList.add("active");
  });
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

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