Autor Zpráva
kajaman
Profil
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
Reaguji na Kajamana:

Uvozovky u setTimeout dej pryč tedy setTimeout(_michejEl(pole[i]),1000);
kajaman
Profil
zobrazí "jedna" ... a nic...
Měsíček
Profil
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
ano, to jsem měl na mysli. prosím, nakopni mě správným směrem...
Měsíček
Profil
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
hmm, funguje :-)
... sice mi není úplně jasné, v čem byla chyba, ale děkuju za ukázku...
Měsíček
Profil
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
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);
    }
}
Předpokládám, že to nevypadá moc srozumitelně. Šlo by to napsat ještě elegantněji, ale to už by asi nebylo srozumitelné vůbec.
Měsíček
Profil
Jen takový malý dotaz .. neříká se náhodou této konstrukci:
  (function () {
    // Nějáký kód
  })();
"Self-invoked functions" (Samovyvolávací funkce)?

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:

0