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

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

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

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

関数

関数(ファンクション・メソッド・サブルーチンとも呼ばれる)は、はプログラムのコードの一部であり、ある特定のタスクを処理するように設計されたものです。

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

Q&A

解決済

1回答

1624閲覧

2回目以降に関数が発動されたとき、先に動いた関数を止めたい

Webtuuuu

総合スコア30

JavaScript

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

関数

関数(ファンクション・メソッド・サブルーチンとも呼ばれる)は、はプログラムのコードの一部であり、ある特定のタスクを処理するように設計されたものです。

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

0グッド

0クリップ

投稿2021/04/01 21:52

編集2021/04/01 22:04

前提・実現したいこと

現在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でセールに最適なカウントダウンタイマーを設置する

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

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

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

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

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

guest

回答1

0

ベストアンサー

こういうことですか?

javascript

1<script> 2window.addEventListener('DOMContentLoaded', ()=>{ 3 var timerId; 4 document.querySelector('#start').addEventListener('click',()=>{ 5 document.querySelector('.result-txt').textContent=""; 6 var max=10; 7 var start=new Date().getTime(); 8 clearInterval(timerId); 9 timerId=setInterval(function(){ 10 var now=new Date().getTime(); 11 var count=Math.ceil(max-(now-start)/1000); 12 document.querySelector('#timecheck').textContent=count; 13 if(count<=0){ 14 document.querySelector('.result-txt').textContent="Time up!"; 15 clearInterval(timerId); 16 } 17 },100); 18 }); 19}); 20</script> 21<p id="timecheck">0</p> 22<p id="start">Aブロック要素</p> 23<p class="result-txt"></p>

投稿2021/04/02 00:51

yambejp

総合スコア114843

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

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

Webtuuuu

2021/04/02 08:35

コメントありがとうございます! こちらのコードで記載していた条件は達成できました! カウントダウンの秒数にミリ秒をリアルタイムで表示させたかったので、本回答を頂いてからこちらの質問を見つけました。 https://teratail.com/questions/79958 こちらと合わせて考えることでミリ秒の実装もできるかなと思います。 本質問の「1回目の関数を止める方法」についてはこちらで解決なのでベストアンサーとさせていただきます!
yambejp

2021/04/02 09:23

ミリ秒単位でやるならワーカーを利用するとよいですよ
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問