• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

question-closed Dropdown menu JavaScript

+1 głos
464 wizyt
pytanie zadane 20 sierpnia 2024 w JavaScript przez niezalogowany
zamknięte 20 sierpnia 2024

Witam, mam pytanie do bardzej doświadczonych kolegów, czy można moj kod napisać lepiej albo go ulepszyć ?

const dropdowns = document.querySelectorAll('.navbar-item.has-dropdown');

const removeActive = (ignored) => {
      dropdowns.forEach(drop => {
            if (drop !== ignored) {
                  drop.classList.remove('is-active');
            }
      });
};

dropdowns.forEach(dropdown => {
      dropdown.addEventListener('click', () => {
            removeActive(dropdown);
            dropdown.classList.toggle('is-active');
      });
});

 

komentarz zamknięcia: Znaleziono rozwiazanie

1 odpowiedź

+2 głosów
odpowiedź 20 sierpnia 2024 przez Comandeer Guru (607,980 p.)

Jeśli chodzi o sam kod, to można przypiąć jeden event listener, na cały kontener z menu, nie zaś na poszczególne rozwijalne elementy. Można to zrobić dzięki technice event delegation.

Natomiast warto też zadbać o to, żeby takie menu było dostępne. W tym zakresie brakuje przede wszystkim dwóch rzeczy: odpowiedniego markupu z ARIA i obsługi klawiaturą. Możesz spojrzeć na przykłady na blogu Adriana Roselliego albo w ARIA Practices. To pierwsze to bardziej takie dropdown menu do nawigacji po stronie, drugie – do jakichś akcji. Nie podałeś za bardzo kontekstu takiego menu, więc trudno stwierdzić, które bardziej pasuje.

komentarz 20 sierpnia 2024 przez niezalogowany
Dziekuję, jeszcze nie do końca rozumiem event delegation
komentarz 22 sierpnia 2024 przez VBService Ekspert (256,600 p.)
edycja 22 sierpnia 2024 przez VBService

Bez event delegation i bez forEach w removeActive.
Znajdź tylko ten element, który ewentualnie już posiada klasę is-active.

const dropdowns = document.querySelectorAll('.navbar-item.has-dropdown');

const removeActive = (skip) => {
  const active = document.querySelector('.navbar-item.is-active');
  if (active && active !== skip) {
    active.classList.remove('is-active');
  }
};

dropdowns.forEach(dropdown => {
  dropdown.addEventListener('click', () => {
    removeActive(dropdown);
    dropdown.classList.toggle('is-active');
  });
});

 

Podobne pytania

0 głosów
1 odpowiedź 535 wizyt
pytanie zadane 25 sierpnia 2019 w JavaScript przez niezalogowany
0 głosów
2 odpowiedzi 1,471 wizyt
0 głosów
1 odpowiedź 607 wizyt
pytanie zadane 20 lipca 2017 w HTML i CSS przez Alterwar Dyskutant (7,650 p.)

93,692 zapytań

142,611 odpowiedzi

323,220 komentarzy

63,220 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

Twierdza Linux. Bezpieczeństwo dla dociekliwych

Aby uzyskać rabat -10%, użyjcie kodu pasja-linux, wpisując go w specjalne pole w koszyku.

...