[JS] JavaScript でストップウォッチを作る
JavaScript でストップウォッチを作ってみます。動くサンプルはこちら。
先にHTML部分です。div部分がクリックされたら stopWatch が実行されます。開始・停止・リセットのボタンを別に用意するのは使い勝手が良くないので、クリックできる部分は1つとします。
<div style="text-align: center; width: 100%;">
<div id="time" onclick="stopWatch()">00:00.00</div>
</div>
開始・停止・リセットのボタンを用意しない代わりに、ステータスで判断しています。
function stopWatch() {
// 現在時刻
startTime = Date.now()
// timeStatus は 0:初期 1:実行中 2:停止中 の状態としています
if (timerStatus === 0) {
// 0:初期 でクリックした場合は updateTime を実行
updateTime()
timerStatus = 1
} else if (timerStatus === 1) {
// 1:実行中 でクリックした場合は clearTimeout でタイマー処理を停止します
clearTimeout(timer)
timerStatus = 2
} else if (timerStatus === 2) {
// 2:停止中 でクリックした場合は 表示されている値をゼロにリセットします
showTime.innerHTML = '00:00.00'
timerStatus = 0
}
}
時間が更新されていくタイマー表示の部分です。
function updateTime() {
// setTimeout で 10msecごとに実行します
// timer という名前で設定し、停止する際に指定します
timer = setTimeout(function() {
// 「現在日時 - スタート時の日時」を引き、表示する時間を算出します
elapsedTime = Date.now() - startTime;
// toISOString で表示する時間フォーマットにして必要な部分だけを抜き出します
showTime.textContent = new Date(elapsedTime).toISOString().slice(14, 22);
updateTime()
}, 10);
}
全体のコードです。
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>Stop Watch</title>
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Noto+Sans+Mono&display=swap" rel="stylesheet">
<style>
#time {
display: inline-block;
font-size: 40px;
padding: 10px 10px;
border-radius: 10px;
color: #000;
background-color: #CCC;
}
</style>
</head>
<body>
<div style="text-align: center; width: 100%;">
<div id="time" onclick="stopWatch()">00:00.00</div>
</div>
<script>
let startTime;
let elapsedTime = 0
let timer
let timerStatus = 0
showTime = document.getElementById("time");
function stopWatch() {
startTime = Date.now()
if (timerStatus === 0) {
updateTime()
timerStatus = 1
} else if (timerStatus === 1) {
clearTimeout(timer)
timerStatus = 2
} else if (timerStatus === 2) {
showTime.innerHTML = '00:00.00'
timerStatus = 0
}
}
function updateTime() {
timer = setTimeout(function() {
elapsedTime = Date.now() - startTime;
showTime.textContent = new Date(elapsedTime).toISOString().slice(14, 22);
updateTime()
}, 10);
}
</script>
</body>
</html>