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

jQuery on click argument dodany do funkcji jest błędny

+1 głos
59 wizyt
pytanie zadane 14 października 2021 w JavaScript przez Mruczekkk Nowicjusz (220 p.)

Chcę dodać funkcję przyjmującą 1 argument dla każdego elementu, robię to w pętli for, funkcja na zdarzenie on click jest faktycznie podpięta ale argument jest błędny. 

for( i=0; i< 10;i++)
{
    $('#c'+i).on("click", function() {mojafunkcja(i); } );
}
function mojafunkcja(nr)
{
    var nr=nr;
 }

Numer jaki wchodzi do funkcji nie ważne na który element kliknę zawsze jest 10. Nie rozumiem tego, dlaczego nie przypisuje prawidłowego argumentu dla 0 ->0 dla 1->1 itp. Jak przechodzę przez for to wszystko się zgadza, klikam na element i jest nr=10. Tak jakby brał ostatnią wartość "i".

komentarz 15 października 2021 przez VBService Mędrzec (163,370 p.)
edycja 1 lutego przez VBService

Może spróbuj z each()

 

przykład

<div id="c0">--c0--</div>
<div id="c1">--c1--</div>
<div id="c2">--c2--</div>
<div id="c3">--c3--</div>
<div id="c4">--c4--</div>
<div id="c5">--c5--</div>

<style>
  div { margin: 1em; }
</style>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.6.0/jquery.min.js"></script>
$('[id^=c]').each(function(index) {
  $('#c'+index).on("click", function() {      
    mojafunkcja(index); 
  });
});
function mojafunkcja(nr)
{
  var nr=nr;
  console.log(nr);
}

 

CSS Selectors ]

1 odpowiedź

+2 głosów
odpowiedź 14 października 2021 przez ScriptyChris Mędrzec (179,600 p.)
wybrane 14 października 2021 przez Mruczekkk
 
Najlepsza

To chyba klasyczny przykład z asynchronicznym kodem w pętli, gdy używa się scope'u nie-blokowego. Zanim wykona się Twój kod, to pętla zdąży się wykonać w całości, więc będzie mieć wartość z ostatniej iteracji.

Zadeklaruj zmienną i słówkiem let lub owiń podpięcie click handlera w IIFE, co pozwoli domknąć scope dla zmiennej - wtedy przy obsłudze eventu i będzie mieć wartość z iteracji, w której handler został podpięty.

Podobne pytania

0 głosów
3 odpowiedzi 139 wizyt
0 głosów
3 odpowiedzi 262 wizyt
pytanie zadane 31 lipca 2018 w JavaScript przez Wyshak Początkujący (260 p.)
0 głosów
1 odpowiedź 131 wizyt
pytanie zadane 23 października 2019 w JavaScript przez Mavimix Dyskutant (8,230 p.)

87,976 zapytań

136,557 odpowiedzi

304,508 komentarzy

58,337 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Sklep oferujący ćwiczenia JavaScript, PHP, rozmowy rekrutacyjne dla programistów i inne materiały

Oto dwie polecane książki warte uwagi. Pełną listę znajdziesz tutaj.

...