• 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

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

93,735 zapytań

142,671 odpowiedzi

323,294 komentarzy

63,297 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.

...