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

element[i].addEventListener is not a function

VMware Cloud PRO - przenieś swoją infrastrukturę IT do chmury
0 głosów
1,567 wizyt
pytanie zadane 11 września 2016 w JavaScript przez Frozenfroggie Użytkownik (990 p.)

Witam, mam tablicę z obrazkami i chcę ustawić na te obrazki event listener, niestety w konsoli pojawia mi się błąd "element[i].addEventListener is not a function". Oto mój kod:

var element = new Array;
for (i = 0; i <= 17; i++) {
 element[i]=document.getElementsByTagName('"img'+i+'"');
 element[i].addEventListener("click", jakasfunkcja);
}

 

2
komentarz 11 września 2016 przez ScriptyChris Mędrzec (190,190 p.)

Zapomniałeś o nawiasie przy new Array. Jednakże możesz zapisać po prostu var element = [];

Poza tym metoda document.getElementsByTagName() zwraca kolekcję elementów HTML, a nie pojedynczy element. Nie możesz przypisać EventListenera do więcej niż jednego elementu w jednej instrukcji. Oprócz tego, sam zapis '"img'+i+'"' jest zagmatwany - pojedynczy cudzysłów (apostrof) ma większe znaczenie od podwójnego cudzysłowia, a Ty je pomieszałeś.

Dodatkowo, w pętli korzystasz z globalnej zmiennej i, zamiast ją sobie zadeklarować (zapisać var albo ES6 let / const).

komentarz 11 września 2016 przez Comandeer Guru (607,060 p.)

Zapomniałeś o nawiasie przy new Array.

Nie zapomniał. Działa też bez nawiasów – chociaż z takim zapisem w JS nie spotkałem się już wieki. 

komentarz 11 września 2016 przez Frozenfroggie Użytkownik (990 p.)
edycja 11 września 2016 przez Frozenfroggie
Dzięki za uwagi, czyli rozumiem, że bardziej poprawna jest deklaracja za pomocą literału? Co do zapisu '"img' + i + '"', specjalnie użyłem apostrofów, żeby "i" nie odczytywało mi jako znak lecz jako zmienną- chciałem w pętli inkrementować "i", tak  żeby w każdym obrocie pętli "łapać" inny element po id: img0, img1, img2, aż do img17. Czy raczej powinienem się wystrzegać takiego zapisu?

edit. teraz zauwazyłem.. napisałem getElementsByTagName a nie getElementById, sory za zamieszanie...
1
komentarz 11 września 2016 przez ScriptyChris Mędrzec (190,190 p.)

Co do zapisu '"img' + i + '"', (...)

Wystarczy zapisać document.getElementsByTagName( 'img' + i ); Czyli img jako string i dodanie do tego iteratora i (zachodzi konkatenacja). Nie potrzeba tylu cudzysłowów i apostrofów.

1 odpowiedź

+1 głos
odpowiedź 11 września 2016 przez xmentor Nałogowiec (49,520 p.)
wybrane 11 września 2016 przez Frozenfroggie
 
Najlepsza

Emmm

Może tak:

var imgs = document.querySelectorAll("img");
for (var i = 0, len = imgs.length; i < len; i++) {
    imgs[i].addEventListener("click", fn);
}

Również można użyć pętli for...of albo metody forEach obiektu Array:

[...document.querySelectorAll("img")].forEach((el) => {
    el.addEventListener("click", fn);
});

 

Podobne pytania

0 głosów
2 odpowiedzi 2,800 wizyt
0 głosów
1 odpowiedź 245 wizyt
pytanie zadane 15 kwietnia 2018 w JavaScript przez pawełrichert Nowicjusz (120 p.)
0 głosów
1 odpowiedź 404 wizyt
pytanie zadane 2 czerwca 2023 w JavaScript przez DzikieHarce Użytkownik (690 p.)

93,434 zapytań

142,429 odpowiedzi

322,662 komentarzy

62,798 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

...