🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
JavaScript

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

Q&A

解決済

1回答

907閲覧

テカウントダウンタイマーの止め方

masaru_666

総合スコア13

JavaScript

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

0グッド

1クリップ

投稿2020/12/24 09:09

現在カウントダウンタイマーを作成しており、
下記記述でタイマー自体はできたのですが、タイマーが00:00:00:00を過ぎても動き続けてマイナス表示になってしまいました。
そこでタイマーを00:00:00:00ちょうどで止めたいです。

javascript

1$(document).ready(function(){ 2//オブジェクト取得 3const counter = document.querySelector('.counter'); 4 5//あと何日メソッド 6function countdowntimer(){ 7 8//今の日時 9const d1 = new Date(); 10//ターゲット日時 11const d2 = new Date('2021/1/13 18:00'); 12//時差(ミリ秒) 13const d3 = d2 - d1; 14// ミリ秒から秒に 15const d3_Sec = Math.floor(d3 / 1000); 16 17//分、時、日の秒数 18const Minute_Sec = 60; 19const Hour_Sec = 60 * 60; 20const Day_Sec = 60 * 60 * 24; 21 22//あと何日 23const d4_Day = Math.floor(d3_Sec / Day_Sec); 24const Day = ("00" + d4_Day).slice( -2 ); 25 26//あと何時間 27const d5_Hour = Math.floor(d3_Sec / Hour_Sec % 24); 28const Hour = ("00" + d5_Hour).slice( -2 ); 29 30//あと何分 31const d6_Minute = Math.floor(d3_Sec / Minute_Sec % 60); 32const Minute = ("00" + d6_Minute).slice( -2 ); 33 34//あと何秒 35const d7_Sec = Math.floor(d3_Sec % 60); 36const Sec = ("00" + d7_Sec).slice( -2 ); 37 38//カウントダウン 39counter.innerHTML = "<span>" + Day + "</span><span>" + Hour + "</span><span>:</span><span>" + Minute + "</span><span>:</span><span>" + Sec + "</span>"; 40 41//1秒ごとに実行 42setTimeout(nanNichi, 1000); 43} 44 45//関数実行 46countdowntimer(); 47});

改善点としてclearTimeoutを使ってとめる方法があると分かり
下記コードに修正したところタイマーが動的に動かなくなり、ロードするごとに動くようになってしまいました。

javascript

1$(document).ready(function(){ 2const counter = document.querySelector('.counter'); 3function countdowntimer(){ 4 const countdown = setTimeout(function(){ 5 //今の日時 6const d1 = new Date(); 7//ターゲット日時 8const d2 = new Date('2020/12/24 17:55'); 9//時差(ミリ秒) 10const d3 = d2 - d1; 11// ミリ秒から秒に 12const d3_Sec = Math.floor(d3 / 1000); 13//分、時、日の秒数 14const Minute_Sec = 60; 15const Hour_Sec = 60 * 60; 16const Day_Sec = 60 * 60 * 24; 17//あと何日 18const d4_Day = Math.floor(d3_Sec / Day_Sec); 19const Day = ("00" + d4_Day).slice( -2 ); 20//あと何時間 21const d5_Hour = Math.floor(d3_Sec / Hour_Sec % 24); 22const Hour = ("00" + d5_Hour).slice( -2 ); 23//あと何分 24const d6_Minute = Math.floor(d3_Sec / Minute_Sec % 60); 25const Minute = ("00" + d6_Minute).slice( -2 ); 26//あと何秒 27const d7_Sec = Math.floor(d3_Sec % 60); 28const Sec = ("00" + d7_Sec).slice( -2 ); 29const remainDay = (d2 - d1); 30 if (remainDay >= 0){ 31 counter.innerHTML = "<span>" + Day + "</span><span>" + Hour + "</span><span>:</span><span>" + Minute + "</span><span>:</span><span>" + Sec + "</span>"; 32 if ((Day == 0) && (Hour == 0) && (Minute == 0) && (Sec == 0)) {//指定の日時が来たら、 33 clearTimeout(countdown);//カウントダウンを止める 34 counter.innerHTML = "<span>test1</span>";//htmlに出力 35 } 36 }else{//指定の日時が過ぎてもテキストを表字させる用 37 counter.innerHTML = "<span>test2</span>"; 38 } 39 }, 1000);//処理を1秒後に予約 40 } 41 countdowntimer();//関数を呼び出す 42}); 43

動的に動かしつつ、目的の日時(00:00:00:00)になったときにタイマーをストップさせるにはどうすればよいのでしょうか。

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

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

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

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

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

guest

回答1

0

ベストアンサー

「ピッタリ」止めることはできない。
setTimeoutは「指定時間が経過した後、できるだけ早く」処理を呼び出す仕組みだ。
CPUが他の仕事をしていたりしたら遅れることもあるし、そもそもコードの処理には時間がかかるので、予定していた時刻ピッタリに関数が起動しても、差を計算する処理までの間に時間が経過する事は避けられない。
だから普通は「ゼロ」ではなく「ゼロ以下」になったら処理を止める。

最初のコードの方が手間がかからないのでこっちを改造する方向で書くと、 d3_Sec の初期化行を
const d3_Sec = Math.max(Math.floor(d3 / 1000), 0);
とでもして、表示に使う時刻が0を下回らないようにしたうえで、setTimeoutを

javascript

1if(d3 > 0){ 2 setTimeout(nanNichi, 1000); 3}

とでもすればいいだろう。

setInterval を使った方がもう少しコードは綺麗になるのだが、改善点を上げているとキリがないので控える。

投稿2020/12/24 12:28

fukken

総合スコア73

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問