@litash

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

Есть 5 кнопок и 5 блоков, нужно при клике на первую кнопку показывать первый блок и скрывать остальные и так далее, чтобы на каждую кнопку показывался только один нужный блок. Как это более менее правильно организовать и написать js код, чтобы не делать 5 функций на клик?
  • Вопрос задан
  • 197 просмотров
Решения вопроса 1
0xD34F
@0xD34F Куратор тега JavaScript
<div class="tab-headers">
  <button data-id="1">69</button>
  <button data-id="2">187</button>
  <button data-id="3">666</button>
</div>

<div class="tab-contents">
  <div data-id="1">hello, world!!</div>
  <div data-id="2">fuck the world</div>
  <div data-id="3">fuck everything</div>
</div>

.tab-contents div {
  display: none;
}

.tab-contents div.active {
  display: block;
}

.tab-headers button.active {
  background: red;
  color: white;
}

const headerSelector = '.tab-headers button';
const contentSelector = '.tab-contents div';
const activeClass = 'active';


// делегирование, назначаем обработчик клика один раз для всех кнопок;
// соответствие кнопок и блоков устанавливаем через равенство атрибутов
document.addEventListener('click', e => {
  const header = e.target.closest(headerSelector);
  if (header) {
    const { id } = header.dataset;
    const toggle = n => n.classList.toggle(activeClass, id === n.dataset.id);
    document.querySelectorAll(headerSelector).forEach(toggle);
    document.querySelectorAll(contentSelector).forEach(toggle);
  }
});

// или, назначаем обработчик клика каждой кнопке индивидуально;
// соответствие кнопок и блоков устанавливаем через равенство индексов
const headers = document.querySelectorAll(headerSelector);
const contents = document.querySelectorAll(contentSelector);

headers.forEach(n => n.addEventListener('click', onClick));

function onClick() {
  const index = Array.prototype.indexOf.call(headers, this);
  const toggle = (n, i) => n.classList.toggle(activeClass, i === index);
  headers.forEach(toggle);
  contents.forEach(toggle);
}
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
UnluckySerivelha
@UnluckySerivelha
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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