performance.now()で現在のタイムスタンプを取得し、スタートボタンを押したときとの差分を求め、その差分を累積時間に加算していくことでストップウォッチが作れると思います。
<div id="timer"></div> <button id="button"></button> <script> let accumTime = 0;//累積時間 let startTime = 1000;//スタートさせる時間を1000msと仮定 let timer = document.getElementById("timer"); let button = document.getElementById("button"); button.addEventListener("click" , function() { update(); }); function update() { accumTime += (performance.now() - startTime); timer.textContent = accumTime; } </script>
しかしここで疑問があります。accumTimeに加算していくと、1秒ごとに以下のように数値が雪だるま式に増えていきますから、おかしいです。
accutime =0 + 1100 - 1000//accumTime = 100 accutime =100 + 1200 - 1000//accumTime = 300 accutime =200 + 1300 - 1000//accumTime = 500 accutime =300 + 1400 - 1000//accumTime = 700
そこでupdate関数内を変更すると期待した動作になります。
function update() { timer.textContent = accumTime + (performance.now() - startTime); }
しかし、2つのupdate関数の違いがわかりません。
1つめは加算代入だから、雪だるま式に増えるということですよね。しかし、2つ目も加算代入と思うんですが、違いを教えていただけますか?
以下、修正したコードです
ボタンを押すとタイマーが作動し、もう1度押すとストップします。トグルを追加しました。
<div id="timer">0</div> <button id="button">ぼたん</button> <script> let accumTime = 0;//累積時間 let startTime =0; let timer = document.getElementById("timer"); let button = document.getElementById("button"); let toggle = "stop"; let interval_id; button.addEventListener("click" , function() { switch(toggle) { case "stop": interval_id = setInterval(update , 100); toggle = "run"; break; case "run": clearInterval(interval_id); toggle = "stop"; break; } }); function update() { accumTime += (performance.now() - startTime); timer.textContent = accumTime; } </script>
回答2件
あなたの回答
tips
プレビュー