Как скрывать текущий item(li) при открытие другого item(li)?

Как скрывать текущий item(li) при открытие другого, учитывая что items(li) могут быть вложенными в несколько вложенностей.
  • Вопрос задан
  • 122 просмотра
Решения вопроса 1
0xD34F
@0xD34F Куратор тега JavaScript
Если прямо отвечать на спрошенное, то...
menu.addEventListener('click', ({ target: t }) => {
  if (t.tagName === 'SPAN') {
    const parent = t.parentNode;
    parent.classList.toggle('active');
    for (const n of menu.querySelectorAll('.active')) {
      if (n !== parent) {
        n.classList.toggle('active', n.contains(parent));
      }
    }
  }
});

Но вообще, давайте-ка напишем чуть более универсальное решение.

Что если количество уровней вложенности не будет ограничено числом два? Пусть скрытые элементы показываются только когда активен родитель, а не любой предок, т.е.:

- .menu_list_item.active .submenu {
+ .active > .submenu {

- .submenu_list_item.active .product {
+ .active > .product {

Ну и ещё перестанем зашивать в обработчик клика селекторы и переключаемый класс, определим их отдельно, если вдруг что изменить понадобится, то достаточно будет отредактировать код всего в одном месте:

const container = document.querySelector('#menu');
const itemSelector = 'li';
const buttonSelector = `${itemSelector} span`;
const activeClass = 'active';

container.addEventListener('click', function(e) {
  const item = e.target.closest(buttonSelector)?.closest(itemSelector);
  if (item) {
    item.classList.toggle(activeClass);
    this.querySelectorAll(`.${activeClass}`).forEach(n => {
      if (n !== item) {
        n.classList.toggle(activeClass, n.contains(item));
      }
    });
  }
});
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

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