質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.45%
JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

2回答

591閲覧

ストップウォッチ作成の考え方について

blendegg

総合スコア81

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

0クリップ

投稿2021/08/03 05:20

編集2021/08/03 05:57

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>

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

int32_t

2021/08/03 05:26

<button id="button"> を押すたびに計測開始と終了を繰り返す挙動をしたい、で合ってますか?
yambejp

2021/08/03 05:28 編集

仕様があいまいです ボタンを一度おすとstartしてもう一度おすとstop? その時間差を表示するという感じですか? その間の経過時間の表示などは不要?
blendegg

2021/08/03 05:57

ボタンを押すとタイマーがスタートし、もう1度押すとストップします。修正コードを追加しました。 申し訳ありません。
guest

回答2

0

ベストアンサー

startTimeが計測を開始した時刻だとすると、質問文に書いてあるとおり毎秒呼ばれる update() 内で accumTime を更新してはダメです。修正後の update() が期待どおりの動作で、タイマーを止めるときに accumTime への加算を行えば良いです。

投稿2021/08/03 06:06

int32_t

総合スコア21097

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

blendegg

2021/08/04 05:37

やっとある程度理解できました。 回答がおそくなりすみません。ありがとうございました。
guest

0

前者は可算結果をaccumTimeに代入していますが、後者は代入していませんのでaccumTimeの値は変わらず0のままです。

つまり、timer.textContent = performance.now() - startTime;と実質的に変わらないと思います。

投稿2021/08/03 05:30

Lhankor_Mhy

総合スコア36191

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

blendegg

2021/08/03 06:17

そうしますと、途中からの再スタートが出来ないですね(例えば累積が1000msまで溜まった状態から、再加算)。 どのようにすれば雪だるま式を防ぎつつ、accumTimeに加算出来るでしょうか?
Lhankor_Mhy

2021/08/03 06:41 編集

そう言われましても、「途中からの再スタート」について、私が回答した時点でのご質問から読み取れることはなかったと思いますが…… update()関数が毎秒呼ばれることも書いてなかったと思います。 (update はラップタイムを書くためのメソッドだと思っていました) そもそも、当初のご質問は「違いを教えていただけますか?」であり、不具合の解決についてのご質問ではなかったと理解していますが、合っていますでしょうか? (質問を変更してはいけない、という話ではないです。当方では認識しえなかった、という話です) 編集された新しいご質問のコードを拝読しました。 int32_t さんのご回答の通りでいいと思いますよ。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.45%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問