Orologio colorato con setInterval
Crea un orologio colorato come quello dellâesempio:
Usa HTML/CSS per lo styling, JavaScript aggiorna solo il tempo negli elementi.
First, letâs make HTML/CSS.
Each component of the time would look great in its own <span>:
<div id="clock">
<span class="hour">hh</span>:<span class="min">mm</span>:<span class="sec">ss</span>
</div>
Also weâll need CSS to color them.
The update function will refresh the clock, to be called by setInterval every second:
function update() {
let clock = document.getElementById('clock');
let date = new Date(); // (*)
let hours = date.getHours();
if (hours < 10) hours = '0' + hours;
clock.children[0].innerHTML = hours;
let minutes = date.getMinutes();
if (minutes < 10) minutes = '0' + minutes;
clock.children[1].innerHTML = minutes;
let seconds = date.getSeconds();
if (seconds < 10) seconds = '0' + seconds;
clock.children[2].innerHTML = seconds;
}
In the line (*) we every time check the current date. The calls to setInterval are not reliable: they may happen with delays.
The clock-managing functions:
let timerId;
function clockStart() { // run the clock
if (!timerId) { // only set a new interval if the clock is not running
timerId = setInterval(update, 1000);
}
update(); // (*)
}
function clockStop() {
clearInterval(timerId);
timerId = null; // (**)
}
Nota che la chiamata a update() non è programmata solo in clockStart(), ma immediatamente dopo lâesecuzione della linea (*). Altrimenti il visitatore dovrebbe aspettare fino alla prima esecuzione di setInterval. E lâorologio sarebbe vuoto fino ad allora.
Eâ altresì importante impostare il nuovo intervallo in clockStart() solo quando lâorologio non sta andando. Altrimenti cliccare il bottone start svariate volte imposterebbe multipli intervali concorrenti. Ancora peggio: terremmo solo il timerID dellâultimo intervallo, perdendo la referenza a tutti gli altri. Così non potremmo più fermare lâorologio! Nota che dobbiamo rimuovere il timerID quando lâorologio viene fermato alla linea (**), in modo da permettergi di ricominciare eseguendo clockStart().