前提・実現したいこと
jQueryを使って1つのページにキッチンタイマーを4個作りたいと思っています。
(それぞれ6分、8分、10分、12分)
1つは動くモノを作成できたのですが、残り3つを動かすにはどのように実装すれば良いか分からず困っております。
該当のソースコード
html
1<!DOCTYPE html> 2<html lang="ja"> 3<head> 4 <meta charset="UTF-8"> 5 <meta name="viewport" content="width=device-width, initial-scale=1.0"> 6 <link rel="stylesheet" href="style.css"> 7 <title>Timer</title> 8</head> 9<body> 10 <h1>タイマー</h1> 11 <div class="container"> 12 <div class="element"> 13 <div class="count" id="countBox"></div> 14 <button class="btn1" id="start">start</button> 15 <button class="btn2" id="stop">stop</button> 16 <button class="btn3" id="reset">reset</button> 17 </div> 18 </div> 19 <script src="libs/jquery-3.5.1.min.js"></script> 20 <script src="main.js"></script> 21</body> 22</html>
jQuery
1$(() => { 2 const countBox = $('#countBox'); 3 const start = $('#start'); 4 const stop = $('#stop'); 5 const reset = $('#reset'); 6 7 //タイマーの秒数 8 let setTime = 360; 9 //一時停止した時の秒数 10 let poseTime = setTime; 11 //残りの秒数 12 let timeLeft = setTime; 13 //setIntervalのための変数 14 let testTimer; 15 16 //残りの秒数を表示する関数 17 const displayText = () => { 18 countBox.text(timeLeft); 19 }; 20 21 //1ずつカウントダウンする関数 22 const countDown = () => { 23 timeLeft--; 24 poseTime = timeLeft; 25 displayText(); 26 }; 27 28 //カウントをストップする関数 29 const stopCount = () => { 30 clearInterval(testTimer); 31 }; 32 33 //1000ミリ秒ごとに処理を繰り返す関数 34 const timerStart = () => { 35 36 testTimer = setInterval(function () { 37 if (timeLeft <= 0) { 38 clearInterval(testTimer); 39 } 40 else { 41 countDown(); 42 } 43 }, 1000); 44 45 return; 46 }; 47 48 displayText(); 49 50 //ボタンを押したらカウントダウンスタート 51 start.on('click', () => { 52 stopCount(); 53 timeLeft = poseTime; 54 displayText(); 55 timerStart(); 56 }); 57 58 //ボタンを押したらカウントストップ 59 stop.on('click', () => { 60 stopCount(); 61 }); 62 63 //ボタンを押したらカウントリセット 64 reset.on('click', () => { 65 stopCount(); 66 timeLeft = poseTime = setTime; 67 displayText(); 68 }); 69 70}); 71
クラスやインスタンスを使って作成すれば良いのだろうなというところにはたどり着いたのですが、そこから上記で作ったコードをどのようにクラスに書き込めば良いのか分からない状態です、、、
初歩的な質問で大変申し訳ないのですが、お助けいただけると幸いです。
よろしくお願いいたします。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/10/19 00:49
2020/10/19 00:58
2020/10/19 01:10 編集
回答2件
0
ざっくりこんな感じでどうでしょう
投稿2020/10/19 02:11
編集2020/10/19 02:14総合スコア116835
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/10/19 02:11 編集
2020/10/19 02:11
2020/10/19 02:28
2020/10/19 09:27
0
ベストアンサー
1つのファイルで作ったので見にくいかもしれませんけど
HTML
1<!DOCTYPE html> 2<html lang="ja"> 3 <head> 4 <meta charset="UTF-8"> 5 <meta name="viewport" content="width=device-width, initial-scale=1.0"> 6 <script src="https://code.jquery.com/jquery-3.5.1.min.js" integrity="sha256-9/aliU8dGd2tb6OSsuzixeV4y/faTqgFtohetphbbj0=" crossorigin="anonymous"></script> 7 <title>Timer</title> 8 </head> 9 <body> 10 <h1>タイマー</h1> 11 <div class="container"> 12 <div class="element"> 13 <div class="count" data-time="360"></div> 14 <button class="start-btn">start</button> 15 <button class="stop-btn">stop</button> 16 <button class="reset-btn">reset</button> 17 </div> 18 </div> 19 <div class="container"> 20 <div class="element"> 21 <div class="count" data-time="60"></div> 22 <button class="start-btn">start</button> 23 <button class="stop-btn">stop</button> 24 <button class="reset-btn">reset</button> 25 </div> 26 </div> 27 <div class="container"> 28 <div class="element"> 29 <div class="count" data-time="100"></div> 30 <button class="start-btn">start</button> 31 <button class="stop-btn">stop</button> 32 <button class="reset-btn">reset</button> 33 </div> 34 </div> 35 <script type="text/javascript"> 36 $(() => { 37 $(".element").each(function(){ 38 const countBox = $(this).children('.count'); 39 const start = $(this).children('.start-btn'); 40 const stop = $(this).children('.stop-btn'); 41 const reset = $(this).children('reset-btn'); 42 //タイマーの秒数 43 let setTime = $(this).children(".count").data("time"); 44 //一時停止した時の秒数 45 let poseTime = setTime; 46 //残りの秒数 47 let timeLeft = setTime; 48 //setIntervalのための変数 49 let testTimer; 50 //残りの秒数を表示する関数 51 const displayText = () => { 52 countBox.text(timeLeft); 53 }; 54 //1ずつカウントダウンする関数 55 const countDown = () => { 56 timeLeft--; 57 poseTime = timeLeft; 58 displayText(); 59 }; 60 //カウントをストップする関数 61 const stopCount = () => { 62 clearInterval(testTimer); 63 }; 64 //1000ミリ秒ごとに処理を繰り返す関数 65 const timerStart = () => { 66 testTimer = setInterval(function () { 67 if (timeLeft <= 0) 68 clearInterval(testTimer); 69 else 70 countDown(); 71 }, 1000); 72 return; 73 }; 74 displayText(); 75 //ボタンを押したらカウントダウンスタート 76 start.on('click', () => { 77 stopCount(); 78 timeLeft = poseTime; 79 displayText(); 80 timerStart(); 81 }); 82 //ボタンを押したらカウントストップ 83 stop.on('click', () => { 84 stopCount(); 85 }); 86 //ボタンを押したらカウントリセット 87 reset.on('click', () => { 88 stopCount(); 89 timeLeft = poseTime = setTime; 90 displayText(); 91 }); 92 }) 93 }); 94 </script> 95 </body> 96</html>
複数作る場合はid管理はダメなのでクラス管理にしました。
.count
のdata-time
に秒数を指定することで、好きな時間で作成できます。
もう少しHTMLを省いて、エレメントを作成していくと
HTML
1<!DOCTYPE html> 2<html lang="ja"> 3 <head> 4 <meta charset="UTF-8"> 5 <meta name="viewport" content="width=device-width, initial-scale=1.0"> 6 <script src="https://code.jquery.com/jquery-3.5.1.min.js" integrity="sha256-9/aliU8dGd2tb6OSsuzixeV4y/faTqgFtohetphbbj0=" crossorigin="anonymous"></script> 7 <title>Timer</title> 8 </head> 9 <body> 10 <h1>タイマー</h1> 11 <div class="container" data-time="360"></div> 12 <div class="container" data-time="60"></div> 13 <div class="container" data-time="40"></div> 14 <script type="text/javascript"> 15 $(() => { 16 let a,b; 17 $(".container").each(function(){ 18 a = document.createElement("div"); 19 a.className = "element"; 20 b = document.createElement("div"); 21 b.className = "count"; 22 a.append(b); 23 b = document.createElement("button"); 24 b.className = "start-btn"; 25 b.textContent = "start"; 26 a.append(b); 27 b = document.createElement("button"); 28 b.className = "stop-btn"; 29 b.textContent = "stop"; 30 a.append(b); 31 b = document.createElement("button"); 32 b.className = "reset-btn"; 33 b.textContent = "reset"; 34 a.append(b); 35 $(this).append(a); 36 }) 37 $(".container").each(function(){ 38 const countBox = $(this).children().children('.count'); 39 const start = $(this).children().children('.start-btn'); 40 const stop = $(this).children().children('.stop-btn'); 41 const reset = $(this).children().children('reset-btn'); 42 //タイマーの秒数 43 let setTime = $(this).data("time"); 44 //一時停止した時の秒数 45 let poseTime = setTime; 46 //残りの秒数 47 let timeLeft = setTime; 48 //setIntervalのための変数 49 let testTimer; 50 //残りの秒数を表示する関数 51 const displayText = () => { 52 countBox.text(timeLeft); 53 }; 54 //1ずつカウントダウンする関数 55 const countDown = () => { 56 timeLeft--; 57 poseTime = timeLeft; 58 displayText(); 59 }; 60 //カウントをストップする関数 61 const stopCount = () => { 62 clearInterval(testTimer); 63 }; 64 //1000ミリ秒ごとに処理を繰り返す関数 65 const timerStart = () => { 66 testTimer = setInterval(function () { 67 if (timeLeft <= 0) 68 clearInterval(testTimer); 69 else 70 countDown(); 71 }, 1000); 72 return; 73 }; 74 displayText(); 75 //ボタンを押したらカウントダウンスタート 76 start.on('click', () => { 77 stopCount(); 78 timeLeft = poseTime; 79 displayText(); 80 timerStart(); 81 }); 82 //ボタンを押したらカウントストップ 83 stop.on('click', () => { 84 stopCount(); 85 }); 86 //ボタンを押したらカウントリセット 87 reset.on('click', () => { 88 stopCount(); 89 timeLeft = poseTime = setTime; 90 displayText(); 91 }); 92 }) 93 }); 94 </script> 95 </body> 96</html>
という感じですかね
投稿2020/10/18 16:51
編集2020/10/18 16:52総合スコア535
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/10/18 16:54
2020/10/19 00:47
2020/10/19 02:45
2020/10/19 03:14 編集
2020/10/19 09:16
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。