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

przesyłanie argumentu do funkcji wewnątrz EventListenera

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

Mam EventListenera podpiętego do 18 obrazków:

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

Problem w tym, że funkcja "fn" będzie musiała wiedzieć który obrazek został kliknięty. Myślałem żeby wysłać jej zmienną "i" jako argument lecz kompletnie nie wiem jak to zrobić wewnątrz EventListenera.

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

W EventListenerze umieść anonimową funkcję, w której dopiero wywołasz swoją funkcję z przekazaniem parametru:

imgs[ i ].addEventListener( "click", function() {
  fn( i );
} );

Zalecam również zmianę var na const let, bo możesz się "nadziać na problem" z closure:

(akapit Saving state with closures) http://benalman.com/news/2010/11/immediately-invoked-function-expression/

http://www.2ality.com/2015/02/es6-scoping.html#%3Ccode%3Elet%3C%2Fcode%3E_in_loop_heads

http://www.mennovanslooten.nl/blog/post/62

1 odpowiedź

+3 głosów
odpowiedź 11 września 2016 przez Comandeer Guru (607,060 p.)

Musisz mieć numer indeksu konkretnego obrazka czy starczy Ci odwołanie do samego obrazka? Bo jeśli to drugie, to każdy handler dostaje jako 1. parametr obiekt zdarzenia, a w nim kliknięty element jest we własności target:

function fn( evt ) {
    console.log( evt.target ); // Odwołanie do klikniętego obrazka.
}

 

komentarz 12 września 2016 przez Frozenfroggie Użytkownik (990 p.)

Numer indeksu ;). Ale poradziłem sobie już metodą podaną przez Krzycho92 w komentarzu. Podaje kod, może komuś się kiedyś przyda:

  var imgs = document.getElementsByClassName("klasa_elementow");
    for (var i = 0, len = imgs.length; i < len; i++){
      (function( lockedInIndex ){
      imgs[i].addEventListener("click", function(e) {
        e.preventDefault();
        fn(lockedInIndex);
      }, 'false' );
    })( i );
}

 

Podobne pytania

0 głosów
3 odpowiedzi 1,172 wizyt
pytanie zadane 13 grudnia 2015 w C i C++ przez Sedi Stary wyjadacz (10,200 p.)
0 głosów
1 odpowiedź 711 wizyt
0 głosów
1 odpowiedź 610 wizyt
pytanie zadane 14 czerwca 2018 w JavaScript przez Mebya Użytkownik (700 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

...