• 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
432 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,330 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ź 497 wizyt
pytanie zadane 25 sierpnia 2019 w JavaScript przez niezalogowany
0 głosów
2 odpowiedzi 1,440 wizyt
0 głosów
1 odpowiedź 592 wizyt
pytanie zadane 20 lipca 2017 w HTML i CSS przez Alterwar Dyskutant (7,650 p.)

93,631 zapytań

142,556 odpowiedzi

323,056 komentarzy

63,139 pasjonatów

Advent of Code 2025

Top 15 użytkowników

  1. 2900p. - dia-Chann
  2. 2870p. - DziarnowskiJ
  3. 2827p. - Łukasz Piwowar
  4. 2783p. - raydeal
  5. 2758p. - Adrian Wieprzkowicz
  6. 2713p. - rucin93
  7. 2579p. - Łukasz Eckert
  8. 2523p. - Maurycy W
  9. 2459p. - CC PL
  10. 2082p. - Michal Drewniak
  11. 1885p. - robwarsz
  12. 1851p. - Mariusz Fornal
  13. 1811p. - rafalszastok
  14. 1600p. - Rafał Trójniak
  15. 1588p. - Tomasz Bielak
Szczegóły i pełne wyniki

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

Kursy INF.02 i INF.03
...