前提・実現したいこと
現在javascript(jQuery)を使用してWebアプリを開発しています。
画面上にクリックできるAというブロック(以後Aと呼ぶ)があるとします。
このAをクリックしたときカウントダウンタイマーの処理が入っている関数(関数名:CDT)が実行されます。
例えですが、このカウントダウンが10秒だったとして、タイマーが0秒になったら画面上に「Time UP!」と表示します。
(この部分は問題なく実装できています)
このカウントダウンが10秒~0秒の間で、再度Aをクリックしたとき、タイマーを初期化して10秒に戻し、
再度10秒から0秒に向かってカウントダウンを始めるようにしたいです。
この1回目の関数を実行中に再度同じ関数を実行した場合に1回目の関数を止める方法を知りたいです。
※2回目の処理実行中に3回目の処理が発生した場合は2回目を止めるといった具合です。
発生している問題・エラーメッセージ
現状の書き方ですと、1回目に関数を実行した後、2回目にAをクリックすると1回目の関数が生きたまま2回目の処理として関数が動きます。
1回目にAをクリックして、例えばカウントダウンが残り5秒のタイミングで再度Aをクリックした場合、1回目の残り5秒と2回目の10秒のカウントダウンが同時に走ります。
そうすると、1回目のカウントダウンが0秒になった時、2回目の関数はまだ処理中であっても「Time UP!」と表示されてしまいます。
(そもそも先に動いた関数を後からの処理で止めるということが技術的に可能かどうかも不明な状態です…)
該当のソースコード
html
1// タイマーがカウント中か0秒か確認する用の非表示要素 2<p id="timecheck">0</p> 3 4// 画面上に表示するタイマー 5<p class="time" id="time"></p> 6 7// クリックする要素 8<p id="start">Aブロック要素</p> 9 10// 「Time UP!」を表示する要素 11<p class="result-txt"></p>
js
1// #startをクリックして関数を実行 2$(document).on("click", "#start", function(){ 3 CDT(); 4}); 5 6 7// ▼時間の設定 8function CDT() { 9 var myD = Date.now(); 10 var start = new Date(); // クリックしたタイミングの時間を取得 11 var myS = start.getTime(); // ミリ秒取得 12 var end = new Date(start.setSeconds(start.getSeconds() + 10)); // タップした時間に+10秒 13 var myE = end.getTime(); // ミリ秒取得 14 15 // 判別 16 if (myS <= myD && myE>= myD) { 17 var tl = end; 18 } else if (myS > myD) { 19 var tl = start; 20 } 21 22 var timer = new CountdownTimer('time', tl, 'Time UP!'); // 終了日後のテキスト 23 timer.countDown(); 24}
▼問題の都度停止して再度動かしたい関数
js
1// ▼ カウントダウンタイマー 2function CountdownTimer(elm, tl, mes) { 3 this.initialize.apply(this, arguments); 4} 5CountdownTimer.prototype = { 6 initialize: function (elm, tl, mes) { 7 this.elem = document.getElementById(elm); 8 this.tl = tl; 9 this.mes = mes; 10 }, 11 countDown: function () { 12 var timer = ''; 13 var today = new Date(); 14 var day = Math.floor((this.tl - today) / (24 * 60 * 60 * 1000)); 15 var hour = Math.floor((day * 24) + ((this.tl - today) % (24 * 60 * 60 * 1000)) / (60 * 60 * 1000)); 16 var min = Math.floor(((this.tl - today) % (24 * 60 * 60 * 1000)) / (60 * 1000)) % 60; 17 var sec = Math.floor(((this.tl - today) % (24 * 60 * 60 * 1000)) / 1000) % 60 % 60; 18 var milli = Math.floor(((this.tl - today) % (24 * 60 * 60 * 1000)) / 10) % 100; 19 var me = this; 20 21 var timecheck = $('#timecheck').text(); 22 23 if (timecheck == '0') { 24 // 正常時 25 if ((this.tl - today) > 0) { 26 // カウントダウン処理 27 if (hour) timer += ''; 28 timer += '<span class="cdt_num">' + this.addZero(sec) + '</span><small>秒</small><span class="cdt_num">' + this.addZero(milli) + '</span>'; 29 this.elem.innerHTML = timer; 30 tid = setTimeout(function () { 31 me.countDown(); 32 }, 10); 33 } else { 34 // カウントが0秒になった場合ステータスを1に変更して再度関数を動かす 35 $('#timecheck').text('1'); 36 me.countDown(); 37 } 38 return false; 39 40 } else if (timecheck == '1') { 41 // 時間切れになった時の処理を記載 42 $('.result-txt').html(this.mes); 43 return false; 44 45 } 46 }, 47 addZero: function (num) { 48 return ('0' + num).slice(-2); 49 } 50}
補足情報(FW/ツールのバージョンなど)
カウントダウンの処理については下記の記事に記載のあるコードを参照しています。
Javascriptでセールに最適なカウントダウンタイマーを設置する
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/04/02 08:35
2021/04/02 09:23