Autor Zpráva
Aleš Janda
Profil
Mám jeden problém s tím, kdy se vyhodnocuje kód obsažen ve funkci onclick().

Jednoduchý kód:
<span id="elem1">1</span>
<span id="elem2">2</span>
<span id="elem3">3</span>
<span id="elem4">4</span>
<span id="elem5">5</span>
<script>
 for (var i = 1; i <= 5; i++) {
   document.getElementById('elem'+i).onclick = function() { alert('Kliknul jsi na text č. '+i); };
  }
</script>


Vyrobím 5 prvků a pak jim v cyklu přiřazuji události. V každé události použiju proměnnou cyklu (i). Výsledek je ten, že ať kliknu na cokoliv, vyskočí mi hláška „Kliknul jsi na text č. 6“, tedy funkce se vyhodnotí až po proběhnutí celého cyklu. Co bych chtěl je to, aby se tam dosadilo to aktuální i při přiřazení.

V tomto fóru jsem narazil na vlákna řešící podobnou věc, ale stejně z toho nejsem moudrý. Resp. myslím že mi je celkem jasné, proč se to tak chová, ale nevím co s tím udělat nebo jak to obejít :-)

Mohl by mi někdo poradit, jak tento příklad předělat tak, aby když kliknu třeba na span s textem 3, vyskočil by text „Kliknul jsi na text č. 3“? Laboroval jsem s tím docela dlouho, ale nemůžu na nic elegantního přijít.

Díky.
_es
Profil
Aleš Janda
Pre každý prvok vytváraš inú vnorenú funkciu, ktorá však pristupuje k tej istej premennej i, ktorá je po skončení cyklu nastavená na 6. Tak ako to máš, ti stačí len jedna nevnorená funkcia:
<span id="elem1">1</span>
<span id="elem2">2</span>
<span id="elem3">3</span>
<span id="elem4">4</span>
<span id="elem5">5</span>
<script>
function f(){alert('Kliknul jsi na text ' + this.innerHTML); }
for(var i = 1; i <= 5; i++){
  document.getElementById('elem'+i).onclick = f;
}
</script>
Aleš Janda
Profil
_es
Díky, ten tvůj příklad ale platí jen pro tuto elementární situaci, kdy v innerHTML je to, co chci zobrazit. To ale bohužel v praxi tak není, lze to udělat obecně, že bych vážně předával to i? Obsahem <span>u by přitom mohlo být cokoliv.
_es
Profil
Aleš Janda
Dajú sa zisťovať aj iné veci toho prvku napríklad id a pod., a podľa toho vypísať rôzny text.
Ak má byť vypísaný text úplne nezávislý od prvku, tak to môžeš k tomu prvku priamo priradiť:
function f(){alert('Vlastnost 'i' prvku je: ' + this.i); }
for(var i = 1; i <= 5; i++){
  document.getElementById('elem'+i).onclick = f;
  document.getElementById('elem'+i).i = i;
}
Aleš Janda
Profil
Díky, přiřazení proměnné přímo k prvku je asi ten nejlepší nápad. Myslel jsem, že to jde nějak přiřadit k volání té funkce, ale tohle také bohatě postačí. Díky :-)

Vaše odpověď

Mohlo by se hodit

Neumíte-li správně určit příčinu chyby, vkládejte odkazy na živé ukázky.
Užíváte-li nějakou cizí knihovnu, ukažte odpovídajícím, kde jste ji vzali.

Užitečné odkazy:

Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: