|  | 
|  | 1 | +// Create Template Variables | 
|  | 2 | +const INTERVAL_MS = 1000 / 60; | 
|  | 3 | +let timerID; | 
|  | 4 | +let lastTimerStartTime = 0; | 
|  | 5 | +let millisElapsedBeforeLastStart = 0; | 
|  | 6 | + | 
|  | 7 | +// Get Our Data From The DOM | 
|  | 8 | +const timer = document.getElementById("timer"); | 
|  | 9 | +const startButton = document.getElementById("start-button"); | 
|  | 10 | +const stopButton = document.getElementById("stop-button"); | 
|  | 11 | +const resetButton = document.getElementById("reset-button"); | 
|  | 12 | + | 
|  | 13 | +// USE EVENTS | 
|  | 14 | +startButton.addEventListener("click", startTimer); | 
|  | 15 | +stopButton.addEventListener("click", stopTimer); | 
|  | 16 | +resetButton.addEventListener("click", resetTimers); | 
|  | 17 | + | 
|  | 18 | +// ---- CREATING A FUNCTIONS ---- | 
|  | 19 | + | 
|  | 20 | +// 1. startTimer | 
|  | 21 | +function startTimer() { | 
|  | 22 | +  startButton.disabled = true; | 
|  | 23 | +  stopButton.disabled = false; | 
|  | 24 | +  resetButton.disabled = true; | 
|  | 25 | + | 
|  | 26 | +  lastTimerStartTime = Date.now(); | 
|  | 27 | +  timerID = setInterval(updateTimer, INTERVAL_MS); | 
|  | 28 | +} | 
|  | 29 | + | 
|  | 30 | +// 2. stopTimer | 
|  | 31 | +function stopTimer() { | 
|  | 32 | +  startButton.disabled = false; | 
|  | 33 | +  stopButton.disabled = true; | 
|  | 34 | +  resetButton.disabled = false; | 
|  | 35 | + | 
|  | 36 | +  millisElapsedBeforeLastStart += Date.now() - lastTimerStartTime; | 
|  | 37 | +  clearInterval(timerID); | 
|  | 38 | +} | 
|  | 39 | + | 
|  | 40 | +// 3. resetTimer | 
|  | 41 | +function resetTimers() { | 
|  | 42 | +  resetButton.disabled = true; | 
|  | 43 | +  timer.textContent = "00:00:00"; | 
|  | 44 | +  millisElapsedBeforeLastStart = 0; | 
|  | 45 | +} | 
|  | 46 | + | 
|  | 47 | +// 4. updateTimer | 
|  | 48 | +function updateTimer() { | 
|  | 49 | +  const milllisElapsed = | 
|  | 50 | +    Date.now() - lastTimerStartTime + millisElapsedBeforeLastStart; | 
|  | 51 | +  const secondsElapsed = milllisElapsed / 1000; | 
|  | 52 | +  const minutesElapsed = secondsElapsed / 60; | 
|  | 53 | + | 
|  | 54 | +  const millisText = formateNumber(milllisElapsed % 1000, 3); | 
|  | 55 | +  const secondsText = formateNumber(Math.floor(secondsElapsed) % 60, 2); | 
|  | 56 | +  const minutesText = formateNumber(Math.floor(minutesElapsed), 2); | 
|  | 57 | +  timer.textContent = `${minutesText}:${secondsText}:${millisText}`; | 
|  | 58 | +} | 
|  | 59 | + | 
|  | 60 | +// 5. formatNumber | 
|  | 61 | +function formateNumber(number, desiredLength) { | 
|  | 62 | +  const stringNumber = String(number); | 
|  | 63 | +  if (stringNumber.length > desiredLength) { | 
|  | 64 | +    return stringNumber.slice(0, desiredLength); | 
|  | 65 | +  } | 
|  | 66 | + | 
|  | 67 | +  return stringNumber.padStart(desiredLength, "0"); | 
|  | 68 | +} | 
0 commit comments