ERROR - is not a function

ERROR - is not a function
KB
  • Rejestracja:prawie 6 lat
  • Ostatnio:prawie 6 lat
  • Postów:12
0

Pytanko. Dlaczego dostaje error - Uncaught TypeError: navItems.addEventListener is not a function

https://jsfiddle.net/18po5m7n/

KB
zmieniłem to z querySelectorAll na const navItems = document.querySelector('.nav-items'); error przepadł, ale zamyka menu tylko kiedy klikam w about.
Freja Draco
Freja Draco
  • Rejestracja:około 7 lat
  • Ostatnio:ponad 3 lata
  • Postów:3394
3

navItems = document.querySelectorAll('.nav-items');
Tworzy kolekcję obiektów. Nie możesz zrobić addEventListener na kolekcji, jedynie na obiekcie.


KB
OK, więc jak to teraz ogarnąć. Bezsensem było by "zbiernie" tego pojedynczo (dodawanie klas do kazdego elementu)
SA
  • Rejestracja:ponad 12 lat
  • Ostatnio:około 5 godzin
  • Postów:1435
0
Kopiuj
Bezsensem było by "zbiernie" tego pojedynczo (dodawanie klas do kazdego elementu) 

Dobrze, że zauważasz bezsens tego. Jeszcze lepiej, gdybyś w takich sytuacjach (tj. powtarzanie podobnych czynności) od razu myślał "pętla!"

KB
Zaskocze Cie. POmysłałem. Problemem jest iż nie wiem jak ja napisać heh. Pewnie trzeba utworzyć zmienną, do której pętla 'ściągnie' wszystkie elementy??
SA
  • Rejestracja:ponad 12 lat
  • Ostatnio:około 5 godzin
  • Postów:1435
1

Odpowiadaj w postach.

Kopiuj
Zaskocze Cie. POmysłałem. Problemem jest iż nie wiem jak ja napisać heh. Pewnie trzeba utworzyć zmienną, do której pętla 'ściągnie' wszystkie elementy?? 

Mając już kolekcję elementów z querySelectorAll możesz przeiterować się po nich za pomocą forEach. Jakbym napisał kod byłoby za łatwo, sorry. To musi mieć jakiś aspekt dydaktyczny.

KB
  • Rejestracja:prawie 6 lat
  • Ostatnio:prawie 6 lat
  • Postów:12
0

No tak, w sumie racja.

KB
  • Rejestracja:prawie 6 lat
  • Ostatnio:prawie 6 lat
  • Postów:12
0

Coś w ten deseń?

Kopiuj
const navItems = document.querySelectorAll('.nav-item');

for (i = 0; i < navItems.length; ++i ) {
    console.log("forEach worked");
}
edytowany 2x, ostatnio: KordianB
KB
  • Rejestracja:prawie 6 lat
  • Ostatnio:prawie 6 lat
  • Postów:12
0

Mam takie rozwiązanie - https://jsfiddle.net/yg0dem12/

edytowany 1x, ostatnio: KordianB
Freja Draco
Freja Draco
  • Rejestracja:około 7 lat
  • Ostatnio:ponad 3 lata
  • Postów:3394
0

Oba powyższe rozwiązania są poprawne. forEach jest niby bardziej eleganckie, ale ostatnio czytam, że:
"Warning: JavaScript 1.6's for-each-in loops are deprecated; consider using ES6 for-of instead"
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Errors/For-each-in_loops_are_deprecated


KB
  • Rejestracja:prawie 6 lat
  • Ostatnio:prawie 6 lat
  • Postów:12
0

OK, ale teraz w tym 1 rozwiązaniu należy w inny sposób napisać addEventListener itu niestety utknąłem.

Jakaś podpowiedź?

edytowany 1x, ostatnio: KordianB
Freja Draco
Freja Draco
  • Rejestracja:około 7 lat
  • Ostatnio:ponad 3 lata
  • Postów:3394
1

navItems[i].addEventListener (...)


KB
  • Rejestracja:prawie 6 lat
  • Ostatnio:prawie 6 lat
  • Postów:12
0

Gracjas :)

SI
SI
  • Rejestracja:około 6 lat
  • Ostatnio:ponad rok
  • Postów:136
3

Jeśli chodzi o eventy na wielu obiektach, pamiętaj, że jest jeszcze coś takiego jak event delegation

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.