Autor | Zpráva | ||
---|---|---|---|
kajaman Profil |
#1 · Zasláno: 4. 12. 2008, 13:49:27
ahoj, prosím, kde mám chybu?
<html> <head> <title>Ukázka</title> <script> function michej(pole, elem){ element = document.getElementById(elem); for(i=0; i<pole.length;i++){ setTimeout("_michejEl(pole[i])",1000); } } function _michejEl(text){ element.innerHTML = text; } </script> </head> <body> <span id="sem"></span> <script> pole = new Array("jedna","dva","tri","ctyri"); michej(pole, 'sem'); </script> </body> </html> ... zobrazí "undefined" |
||
Měsíček Profil |
#2 · Zasláno: 4. 12. 2008, 14:14:15
Reaguji na Kajamana:
Uvozovky u setTimeout dej pryč tedy setTimeout(_michejEl(pole[i]),1000); |
||
kajaman Profil |
#3 · Zasláno: 4. 12. 2008, 14:24:37
zobrazí "jedna" ... a nic...
|
||
Měsíček Profil |
#4 · Zasláno: 4. 12. 2008, 14:30:46
Reaguji na Kajamana:
Však ano, jestli chceš, aby se ti postupně vypisovaly hodnoty v poli (po sekundě) musíš na to úplně jinak a hlavně s jinou funkcí. |
||
kajaman Profil |
#5 · Zasláno: 4. 12. 2008, 14:31:37
ano, to jsem měl na mysli. prosím, nakopni mě správným směrem...
|
||
Měsíček Profil |
#6 · Zasláno: 4. 12. 2008, 14:55:42
Reaguji na Kajamana:
<script type="text/javascript"> function dump_array (arr, elem) { var i = 0; setInterval (function () { if (i < arr.length) { document.getElementById(elem).innerHTML = arr[i++]; } }, 1000); } var arr = ["Měsíček","by","se","měl","naučit","javascript!"]; </script> <button onClick="dump_array(arr, 'x');"> Vypiš pole </button> <span id="x"> Zde se začne něco dít! </x> |
||
kajaman Profil |
#7 · Zasláno: 4. 12. 2008, 17:18:47
hmm, funguje :-)
... sice mi není úplně jasné, v čem byla chyba, ale děkuju za ukázku... |
||
Měsíček Profil |
#8 · Zasláno: 4. 12. 2008, 17:36:43
Reaguji na Kajamana:
"hmm, funguje :-) " Jó, to už tak bývá. "... sice mi není úplně jasné, v čem byla chyba, ale děkuju za ukázku..." Není zač .. mimochodem jedna z chyb byla, že jsi použil fc. setTimeout místo setInterval. |
||
Chamurappi Profil |
#9 · Zasláno: 4. 12. 2008, 17:58:23
Reaguji na Měsíčka:
Neřekl bych, že zrovna tohle byla chyba. Tvůj kód bude do nekonečna každou sekundu kontrolovat, jak je velké „i“. Reaguji na kajamana: První chyba byla v tom, že se řetězec předaný funkci setTimeout vyhodnocuje v době, kdy už je hodnota proměnné „i“ jiná. Potřebuješ tzv. „lexikální uzávěr“ (známý též jako closure), který ti uchová hodnotu proměnné nezávisle na okolí. S tou proměnnou pak musíš pracovat v lokálním kontextu, tzn. nedávat do setTimeoutu řetězec (ten se vyhodnocuje globálně), ale rovnou funkci. Za druhou chybu lze považovat to, že ti všechny timeouty proběhnou ve stejný čas, tedy jednu sekundu od nastavení. Měl bys k tomu času 1000 ms přičítat násobek proměnné „i“. function michej(pole, elem){ element = document.getElementById(elem); for(i=0; i<pole.length;i++){ (function(i) // toto je lexikální uzávěr { setTimeout(function() // toto je náhrada za řetězec, která zařídí, že se pracuje s lokálním i { _michejEl(pole[i]) }, 1000 + i * 1000); })(i); } } |
||
Časová prodleva: 24 dní
|
|||
Měsíček Profil |
#10 · Zasláno: 28. 12. 2008, 10:59:55 · Upravil/a: Měsíček
Jen takový malý dotaz .. neříká se náhodou této konstrukci:
(function () { // Nějáký kód })(); |
||
Časová prodleva: 15 let
|
0