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

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

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

Ruby on Rails 5は、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

HTML5

HTML5 (Hyper Text Markup Language、バージョン 5)は、マークアップ言語であるHTMLの第5版です。

JavaScript

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

Q&A

解決済

3回答

541閲覧

JavaScriptでタイマーを作成しました。カウントがされタイマーが00:00になったとき、というのはどのように記述するのでしょうか。

kikikinoki

総合スコア11

Ruby on Rails 5

Ruby on Rails 5は、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

HTML5

HTML5 (Hyper Text Markup Language、バージョン 5)は、マークアップ言語であるHTMLの第5版です。

JavaScript

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

0グッド

0クリップ

投稿2019/07/29 11:18

編集2019/07/30 04:18

タイマーをJavaScriptで作成しました。
リセット時や初期値を除いて、タイマーのカウントが0になったとき、という条件定義はどのようにすれば
いいのでしょうか。

下記がコードになります。

よろしくお願いします。

JavaScript

1window.onload = function(){ 2 3 var sound = document.getElementById("sound"); 4 5 var timer = document.getElementById('timer') 6 var set = document.getElementById('set') 7 var reset = document.getElementById('reset') 8 var start = document.getElementById('start') 9 10 // クリック時の時間を取得する 11 var startTime; 12 13 var timeLeft; 14 var timeToCountDown = 0; 15 var timerId; 16 var isRunning = false; 17 18 // 残り時間を表示させる 19 function updateTimer(t) { 20 var d = new Date(t); 21 var m = d.getMinutes(); 22 var s = d.getSeconds(); 23 m = ('0' + m).slice(-2); 24 s = ('0' + s).slice(-2); 25 timer.textContent = m + ':' + s; 26 } 27 28 function countDown() { 29 timerId = setTimeout(function() { 30 timeLeft = timeToCountDown - (Date.now() - startTime); 31 if (timeLeft < 0) { 32 isRunning = false; 33 start.textContent = 'Start'; 34 clearTimeout(timerId); 35 timeLeft = 0; 36 timeToCountDown = 0; 37 updateTimer(timeLeft); 38 return; 39 } 40 updateTimer(timeLeft); 41 countDown(); 42 }, 100); 43 } 44 45 start.addEventListener('click', function() { 46 // タイマーが0のときはストップと表示するようにする 47 if (isRunning === false) { 48 isRunning = true; 49 start.textContent = 'Stop' 50 startTime = Date.now(); 51 countDown(); 52 } else { 53 // タイマーがstopのときはstartと表示する 54 isRunning = false; 55 start.textContent = 'Start'; 56 timeToCountDown = timeLeft; 57 clearTimeout(timerId); 58 } 59 }); 60 61 // Setを押した時の処理 62 set.addEventListener('click', function() { 63 // タイマーが動いているときは操作できないようにする 64 if (isRunning === true){ 65 return; 66 } 67 // timeToCountDownを25分にセットする処理を書いていく 68 timeToCountDown += 1500 * 1000; 69 // 25分を超えても 70 if (timeToCountDown >= 60 * 26 * 1000) { 71 // 25分になるように設定 72 timeToCountDown = 1500 * 1000; 73 } 74 // timeToCountDownをタイマーに反映 75 updateTimer(timeToCountDown); 76 }); 77 78 reset.addEventListener('click', function() { 79 // timeToCountDownを0にする処理を書いていく 80 timeToCountDown = 0; 81 // timeToCountDownをタイマーに反映 82 updateTimer(timeToCountDown); 83 }); 84}();

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

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

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

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

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

hentaiman

2019/07/29 12:10

キッチンタイマーみたいなタイマー?
kikikinoki

2019/07/29 12:16 編集

左様でございます。Setを押すと25分にセットされ、Startを押すと00:00に向かってカウントダウンを開始します。
yutampp

2019/07/29 12:54

このコード動きます? 聞きたいことは条件定義だけで大丈夫ですか? ① 'use scrict'; → "use strict"(厳格モード)のスペルミスですね。 ②var time = new Date; → なんでかエラーにならずに動きますが、普通new Date();とします。 ③hour.innerHTML = select_option; → hourとselect_optionが未定義です。 ④select_option = ""; → 宣言されていない変数への代入は非厳格モードだと動きますが、厳格モードだとエラーになります。 ⑤minute.innerHTML = select_option; → minuteが未定義です。 ⑥function updateTimer(t)  → 厳格モードだとエラーになります。
guest

回答3

0

  1. 10秒にセットしてスタート押したら、押した時点+10秒のDateを作る(timerDateとする)
  2. 現在時刻がtimerDateを超えるまで判定し続ける(setTimeoutかsetIntervalで)
  3. 超えたらtimer処理を止める

投稿2019/07/29 12:20

hentaiman

総合スコア6421

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

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

0

タイマーなので
現在日時から指定のタイマー時間後をゴールに設定し、「その日時を過ぎたら(>=その日時)」で良いと思います

投稿2019/07/29 12:21

編集2019/07/29 12:25
m.ts10806

総合スコア80850

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

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

hentaiman

2019/07/29 12:23

イコールだと止まらない可能性が
guest

0

ベストアンサー

ツッコミどころの多いコードについてはそっとしておくこととして、カスタムイベントを作ることでclickイベントやloadイベントと同じように、「00:00になったとき」をイベントとして定義することが可能です。
カスタムイベントの作り方は簡単で以下のようなコードで作成できます。

javascript

1// イベントの定義 2var event=new Event("CustomEventHogehoge"); 3// イベントターゲットを作成 4var eventTarget = new EventTarget();

CustomEventHogehogeがイベントの名前になります。これは任意の文字列で構いません。
イベントターゲットはElement および document、window などでもOKです。
要はどの実体に、イベントを発生させるかという話です。
イベントターゲットについて詳しくは以下を参照してください。
https://developer.mozilla.org/ja/docs/Web/API/EventTarget

あとは、loadイベントや、clickイベントと同じようにリスナーを登録すればOKです。

javascript

1// イベントターゲットにイベントリスナーを登録 2eventTarget.addEventListener("CustomEventHogehoge",()=>{/*発火したときの処理*/});

これだけだと、いつまでたってもイベントが発火しません。
発火させるには任意のタイミングで以下のコードを実行する必要があります。

javascript

1eventTarget.dispatchEvent(event); 2// → イベントリスナーに登録した関数が実行される。

eventは先ほど「//イベントの定義」で、作成した変数です。

以上を活用して、キッチンタイマーをモダンっぽい書き方をしてみましょう。
まずキッチンタイマーのクラスを作成します。

javascript

1class Piyo extends EventTarget 2{ 3 constructor(func) 4 { 5 super(); 6 this.event=new Event("TimeOut"); 7 this.addEventListener("TimeOut",func); 8 // デフォルト5秒 9 this.time=5*1000; 10 this.timeoutId=0; 11 } 12 13 start() 14 { 15 this.timeoutId = setTimeout 16 ( 17 ()=>{this.dispatchEvent(this.event)} 18 ,this.time 19 ) 20 } 21 stop() 22 { 23 clearTimeout(this.timeoutId); 24 } 25}

このクラスを使って、例として、5秒後アラートが表示されるインスタンスを生成してみました。

javascript

1var piyopiyo = new Piyo(function(){alert("TIMEUP!!!")}); 2piyopiyo.start();

これで5秒後に"TIMEUP!!!"がアラートで出てきます。
現状のPiyoクラスはカウントダウン機能が実装されていないので、どうすれば実装できるか考えてみてください。

投稿2019/07/30 03:55

編集2019/08/01 03:34
yutampp

総合スコア182

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

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

kikikinoki

2019/07/30 04:21

ありがとうございます!参考に頑張ってみます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問