Cronometru cu milisecunde

Discutii si intrebari legate de scripturi si functii JavaScript, jQuery si Ajax, cod JavaScript in general.
Stefan
Mesaje: 117

Cronometru cu milisecunde

Salut, in ultima perioada incerc sa ma imprietenesc cu Javascript (chiar daca el nu prea vrea) si vreau sa inteleg cat mai mult, de aceea postez cam des. Am avut o tentativa de a face un cronometru (cat de simplu) care sa afiseze si milisecundele dar am cateva probleme:
1) Cronometrarea nu mi se pare ca este prea precisa;
2) Imi afiseaza multe zecimale si nu inteleg de ce. Poza: imgur.com/a/bc6o4
3) Timpul nu se opreste fix la 0 (asta este si normal fiindca apar acele zecimale)

Cod: Selectaţi tot

var i=7.8;
var timp  = setInterval(cronometru, 100) ;
function cronometru() {
  if(i <= 0){
    clearInterval(timp);
    return;
  }
  i=i-0.1;
  $('#timp').val(i);
}
Si in pe langa asta, intre secunda si milisecunda cum as putea pune un punct?

MarPlo Mesaje: 4343
Salut,
Poti posta cat de des ai nevoie, dar daca nu se implica si altii sa ajute, raspunsul meu din ceea ce stiu e in timpul disponibil.

Afisarea nu e precisa din cauza vitezei de procesare care e mai mica de o nanosecunda, care e cu mult intre o miime si 0.
Ca sa faci precizia la milisecunda, se aplica metoda toFixed(3).
Ca sa afiseze oprirea corect la 0, codul de afisare se adauga inainte de "return".
Punctul e deja adaugat automat intre intreg si zecimale (secunda si miimi).
Codul functional:

Cod: Selectaţi tot

<input type='text' id='el_tmp' />
<script>
var i=7.8; //seconds to start from
var intv =.1; //time interval to decrease the i
var timp  = setInterval(cronometru, 1000*intv);
let el_tmp = document.querySelector('#el_tmp');
function cronometru(){
  i-= intv;
  i = i.toFixed(3);  //set precision to milliseconds (to 3 decimals)
  if(i >=0) el_tmp.value = i;  
  else return clearInterval(timp);
}
</script>

Stefan Mesaje: 117
Nu functioneaza corect, se exectuta mult prea rapid si nu cred ca dureaza mai mult de o secunda pana ajunge la 0, de ce?

MarPlo Mesaje: 4343
Functia setInterval() se execuuta prea repede, nu tinusem seama de valoare miimilor de secunda la apelarea ei.
Am corectat, in loc de:

Cod: Selectaţi tot

var timp  = setInterval(cronometru, intv);
Corect e:

Cod: Selectaţi tot

var timp  = setInterval(cronometru, 1000*intv);