Opakování pomocí setInterval
setTimeout() spustí funkci jednou. setInterval() ji spouští znovu a znovu, vždy po zadaném počtu milisekund, dokud takový interval nezastavíte. I setInterval() vrací id a interval zastaví clearInterval(). Tady je odpočet před startem rakety:
const odpocet = document.querySelector("#odpocet");
let sekundy = 3;
odpocet.textContent = sekundy;
const casovac = setInterval(function () {
sekundy--;
if (sekundy === 0) {
clearInterval(casovac);
odpocet.textContent = "Start!";
} else {
odpocet.textContent = sekundy;
}
}, 1000);Stránka ukáže 3, o sekundu později 2, pak 1 a nakonec Start! V tu chvíli clearInterval(casovac) interval zastaví a jeho funkce už se nespustí.
Všimněte si, že:
- Funkce se poprvé spustí až po první sekundě, ne hned. Proto skript trojku ukáže sám, ještě než interval spustí.
- Proměnná
sekundyje mimo funkci, aby si číslo pamatovala od jednoho spuštění funkce k dalšímu, stejně jako počítadlo kliknutí. Slet sekundy = 3;uvnitř funkce by každé spuštění začalo zase od 3 a stránka by navždy ukazovala 2. - Interval se může zastavit sám: jeho funkce smí použít
casovac, protože se spustí až později, kdy už je v něm id uložené.
Časté chyby:
- Zapomenutý
clearInterval(): odpočet pokračuje k 0, -1, -2… tak dlouho, dokud je stránka otevřená. clearInterval(sekundy): potřebuje id intervalu, ne číslo, které odpočítáváte.- Interval spuštěný dvakrát, třeba dvěma kliknutími na tlačítko Start: pak běží dva intervaly najednou a odpočet jde dvakrát rychleji. Stejně jako u rakety v minulém cvičení nejdřív zastavte předchozí interval pomocí
clearInterval(casovac).
Jak psát:
Pokyny
V obsluze tlacitkoStart pod oba její řádky spusťte interval, který každou sekundu zmenší zbyvaSekund o 1 a ukáže novou hodnotu v prvku displej. Vyzkoušejte to: od 3 minutka odpočítává 3, 2, 1, 0, -1… Zatím se nezastaví.
Zastavte ji na nule. Vedle zbyvaSekund vytvořte pomocí let proměnnou casovac a uložte do ní interval. Když zbyvaSekund klesne na 0, zastavte interval pomocí clearInterval(casovac) a místo nuly ukažte Čas vypršel!.
Když se klikne na tlacitkoStop, zastavte minutku pomocí clearInterval(casovac). Displej si nechá číslo, které právě ukazuje, takže je vidět, kolik času zbývalo.