Скрыть другие выпадающие списки, когда один из них уже открыт, не работает

#javascript #html

Вопрос:

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

Вот код JavaScript, который у меня есть ниже. Мега-меню в настоящее время правильно переключается при нажатии на каждую родительскую навигационную ссылку, но в настоящее время не скрывает другие мега-меню, когда открыто одно мега-меню.

 const navLink = document.getElementsByClassName("menu-item-has-children");

// Loop over main navigation links
for (let i = 0; i < navLink.length; i  ) {
  // Grab specific ID that each mega menu has
  const menuId = document.querySelector(`#${dropDownMenu[i].id}`);
  // On click of top nav items, toggle mega menu visibility (this works).
  navLink[i].addEventListener("click", () => {
    menuId.classList.toggle("display-on");
  });
  // If the mega menu is open (display-on class is active), then don't show the other mega menus.
  // (This does not work).
  return menuId.classList.contains("display-on")
    ? (menuId.style.display = "none")
    : "";
}
 

Ссылка на живую демонстрацию, включая HTML, здесь, если это необходимо.

Спасибо.

Ответ №1:

Я расширил ваш пример и упростил его. Вы можете увидеть код здесь.

Я использую делегирование событий. Это позволяет обрабатывать все события щелчка (открыть выпадающий список, закрыть выпадающий список с помощью кнопки закрытия) в одном обработчике событий (строка 14 в примере), который, на мой взгляд, легче читать и поддерживать.

В примере также закрывается уже открытое выпадающее меню (см. Строки 21-23).

Я также добавил обработчик событий к объекту document для обработки кликов вне выпадающего списка, чтобы закрыть его, как вы это сделали.

Надеюсь, это решит вашу проблему.

С наилучшими пожеланиями