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

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

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

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

Q&A

解決済

3回答

2549閲覧

残り時間が0秒未満でタイマーを停止する、停止の仕方

退会済みユーザー

退会済みユーザー

総合スコア0

JavaScript

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

0グッド

2クリップ

投稿2019/05/23 05:45

前提・実現したいこと

JavaScriptでタイマーを作成しています。
15秒カウントダウンさせ、0秒になったら、タイマーを停止したいのですが、停止させることができません。

下記の部分がうまくいっていないようなのですが、どのようにかけばよいか教えていただけますでしょうか?

//残り時間が0秒未満だったら、タイマーを停止する。 if(leftTime < 0) { clearTimeout(); }

該当のソースコード

<script> const secondElement = document.querySelector('.second'); const goalTime = new Date().getTime() + 15 * 1000; update(); function update() { // 現在時刻 const currentTime = new Date().getTime(); // 目標時刻までの残り時間 const leftTime = goalTime - currentTime; //残り時間が0秒未満だったら、タイマーを停止する。 if(leftTime < 0) { clearTimeout(); } // 秒の表示。 secondElement.innerText = (leftTime / 1000).toFixed(2); // 次のフレームで再度update()を実行する requestAnimationFrame(update); } </script>

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

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

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

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

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

guest

回答3

0

ベストアンサー

requestAnimationFrameで次のタイミングを予約する以上、それを実行しなければ次のタイミングはやってこなくなります。returnなどでrequestAnimationFrameの行に辿り着く前に脱出しましょう。

javascript

1 //残り時間が0秒未満だったら、タイマーを停止する。 2 if(leftTime < 0) { 3 secondElement.innerText = 'time up!'; 4 return; 5 } 6 // 秒の表示。 7 secondElement.innerText = (leftTime / 1000).toFixed(2); 8 // 次のフレームで再度update()を実行する 9 requestAnimationFrame(update);

投稿2019/05/23 05:49

maisumakun

総合スコア145183

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

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

退会済みユーザー

退会済みユーザー

2019/05/23 05:59

早速のご回答ありがとうございます。上記でうまくできました!本当にありがとうございます。
miyabi_takatsuk

2019/05/23 06:03

cancelAnimationFrameを使わなくてもこれでいけるのですね。 requestAnimationFrameの性質も含め、私も勉強になりました。
guest

0

requestAnimationFrameを止める方法は、
crearTimeoutではないからです。
正しくは下記です。

javascript

1const secondElement = document.querySelector('.second'); 2const goalTime = new Date().getTime() + 15 * 1000; 3 4update(); 5 6function update() { 7 // 止めるためにIDを取得する。requestAnimationFrameは先に書いても、意図した動きになると思われる 8 const requestId = requestAnimationFrame(update); 9 // 現在時刻 10 const currentTime = new Date().getTime(); 11 // 目標時刻までの残り時間 12 const leftTime = goalTime - currentTime; 13 14 // 秒の表示。 15 secondElement.innerText = (leftTime / 1000).toFixed(2); 16 17 //残り時間が0秒未満だったら、タイマーを停止する。 18 if(leftTime < 0) { 19 // requestAnimationFrameを使用しているので、専用の止めるメソッドを使用 20 cancelAnimationFrame(requestId); 21 22 } 23 24 // 次のフレームで再度update()を実行する 25 //requestAnimationFrame(update); 26}

投稿2019/05/23 06:00

miyabi_takatsuk

総合スコア9528

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

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

退会済みユーザー

退会済みユーザー

2019/05/23 06:09

ご回答ありがとうございます。上記につきましても参考にさせていただきます!
guest

0

タイマーの処理自体がどの部分でしょう?
setTimeoutで処理するならidを指定してclearTimeoutをしつつ
繰り返し呼び出し処理を止めればよいのでは?

投稿2019/05/23 05:51

yambejp

総合スコア114814

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

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

退会済みユーザー

退会済みユーザー

2019/05/23 06:02

あまりわからず書いておりますため、うまく説明ができずすみません。 教えていただいた下記の形でうまくできました。気に留めていただきありがとうございました。 ``` if(leftTime < 0) { secondElement.innerText = 'time up!'; return; } ```
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問