mk3mk
@mk3mk
занимаюсь вёрсткой (иногда)

Как оптимальнее при клике на кнопки изменять состояния связанных с ними блоков?

Как оптимизировать код на javascript?
Надо, чтобы при нажатии на кнопку 1 менялся цвет у дива 1, при нажатии на кнопку 2 менялся цвет у дива 2 и т.д. При этом обернуть их в контейнер не могу, т.к. на сайте это будут элементы из разных секций.

Тут упрощенный пример:
https://codepen.io/mk3mk/pen/ZwQxMg?editors=0110

Хочу вместо индексов поставить переменную, но не могу понять как это сделать.

Да, и еще, это надо сделать на чистом js.
  • Вопрос задан
  • 222 просмотра
Решения вопроса 1
0xD34F
@0xD34F Куратор тега JavaScript
const buttonSelector = '.button';
const blockSelector = '.div';
const activeClass = 'red';

function toggleBlock(blocks, buttons, button) {
  const index = Array.prototype.indexOf.call(buttons, button);
  blocks.forEach((n, i) => {
    n.classList[i === index ? 'toggle' : 'remove'](activeClass);
  });
}


// обработчик клика делегированный, назначается один раз
document.addEventListener('click', e => {
  const button = e.target.closest(buttonSelector);
  if (button) {
    const blocks = document.querySelectorAll(blockSelector);
    const buttons = document.querySelectorAll(buttonSelector);
    toggleBlock(blocks, buttons, button);
  }
});

// или, назначаем обработчик клика каждой кнопке индивидуально
const buttons = document.querySelectorAll(buttonSelector);
const blocks = document.querySelectorAll(blockSelector);
const onClick = e => toggleBlock(blocks, buttons, e.currentTarget);
buttons.forEach(n => n.addEventListener('click', onClick));
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

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