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

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

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

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

Q&A

解決済

1回答

1229閲覧

javascript、setinterval,clearinterval関数と、トグルボタンによるカウントアップを行いたい

blendegg

総合スコア81

JavaScript

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

0グッド

0クリップ

投稿2021/07/11 04:06

1つのボタンにスタートとストップの機能をもたせたいです。
以下のコードの場合はstartボタンがそれに相当します。
startを押すとカウントアップを開始し、もう1度押すとカウントアップを停止します。もう1度押すと、途中から再度カウントアップします。

<div id="timer">00</div> <div id="start" class="btn">Start</div> <div id="reset" class="btn">Reset</div> <script> let start_bt = document.getElementById("start"); let timer = document.getElementById("timer"); let mode = false; let t = 0; let addTimer; function startTimer() { addTimer = setInterval(function() { t++; timer.textContent = t; }, 1000); } function stopTimer() { clearInterval(addTimer) } test_bt.addEventListener("click" , function() { switch(mode){ case false: stopTimer(); console.log("1"); case true: startTimer(); console.log("2"); } mode = !mode; console.log(mode); });

しかし、2度め目の押下でカウントアップが止まりませんし、なぜかカウントアップの速度が早くなります。
switchのあたりに問題点がありそうだなと検討はつくのですが、解決出来ませんでした。
どのようにコードを改善すれば良いか、ヒントを頂けますか?

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

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

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

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

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

blendegg

2021/07/11 07:22

それはコードを書いているのが私ですから、同じようなコードになるというだけのことです。
think49

2021/07/11 07:51

前質問の回答を忘れて同じ失敗を繰り返しても良いと考えているのですね…。
kei344

2021/07/11 08:26

まだ質問が「受付中」になっていますが、「ベストアンサー」を選び「解決済」にされてはいかがでしょうか。
guest

回答1

0

ベストアンサー

switch文のcaseにbreakが無いのが原因です。
case false:で止めているのにcase true:の方も実行されているのでタイマが重複して設定されます。

javascript

1<div id="timer">00</div> 2<div id="start" class="btn">Start</div> 3<div id="reset" class="btn">Reset</div> 4 5<script> 6 let start_bt = document.getElementById("start"); 7 let timer = document.getElementById("timer"); 8 9 // 初期値はスタートする方にしておかないとだめじゃないですか? 10 let mode = true; 11 let t = 0; 12 let addTimer; 13 14 function startTimer() { 15 addTimer = setInterval(function() { 16 t++; 17 timer.textContent = t; 18 }, 1000); 19 20 } 21 22 function stopTimer() { 23 clearInterval(addTimer) 24 } 25 26 // test_btになっていました 27 start_bt.addEventListener("click", function() { 28 switch (mode) { 29 case false: 30 stopTimer(); 31 console.log("1"); 32 // breakを追加 33 break; 34 case true: 35 startTimer(); 36 console.log("2"); 37 break; 38 } 39 mode = !mode; 40 console.log(mode); 41 }); 42 43</script> 44

投稿2021/07/11 04:40

k4a

総合スコア983

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

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

blendegg

2021/07/11 07:31

ありがとうございます。 無事動作しました。 switch文は最近使い始めたもので、使い方をよく把握していませんでした。 modeの初期値はたしかにtrueにしておかないとだめですね。 修正しました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.37%

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

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

質問する

関連した質問