limemint
@limemint (斉藤 貴博)

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

入力した数字をカウントダウンタイマーでカウント

解決したいこと

入力した数字をカウントダウンタイマーでカウントしたいと思っています。

任意の数字を入力して、それをHTMLの「00:00」(id = timedisplay)部分に表示させ、STARTボタンを押したらそこからカウントダウンが始まるようにしたいです。

今は0秒カウントで、すぐに「TIME UP」とされてしまいます。
javascriptの1行目で「let baseCount = 0000;」を書いているせいだとは思うのですが、ここをどうやったら任意の数字に変えられて、カウントダウンが始まる(数字の1を4回押したら11:11と認識し、そこから11分11秒がカウントダウンされる)ように設定できるのでしょうか?

ご助言いただければと思います。

冗長なコードなので見にくいかと思いますがご了承下さい。
繰り返しになっている部分(数字の3を入力したら反映するところ以降)は割愛しております。

追加で「業界的にはここはこうするよ」とか「今のトレンドはこう書くよ」などの情報ありましたら教えていただけると嬉しいです。

該当するソースコード

ソースコードを入力
```HTML
<!DOCTYPE html>
<html>
    <head>
        <title>タイマー</title>
        <meta name="description" content="タイマーアプリ">
        <meta charset="utf-8">
        <body>
            <h1><span id="timedisplay">00:00</span></h1>
            <script src="./timer.js"></script>
            <form>
                <input type="button" id="number1" value="1" onclick="btnOneClick();">
                <input type="button" id="number2" value="2" onclick="btnTwoClick();">
                <input type="button" id="number3" value="3" onclick="btnThreeClick();"><br>
                <input type="button" id="number4" value="4" onclick="btnFourClick();">
                <input type="button" id="number5" value="5" onclick="btnFiveClick();">
                <input type="button" id="number6" value="6" onclick="btnSixClick();"><br>
                <input type="button" id="number7" value="7" onclick="btnSevenClick();">
                <input type="button" id="number8" value="8" onclick="btnEightClick();">
                <input type="button" id="number9" value="9" onclick="btnNineClick();"><br>
                <input type="button" id="number0" value="0" onclick="btnZeroClick();"><br>
                <input type="button" id="startBtn" value="START">
                <input type="button" id="stopBtn"  value="STOP">
                <input type="button" id="resetBtn" value="RESET">                       
            </form>
        </body>
    </head>
   </html>


    ```javascript
let baseCount = 0000;
let min = 0;
let sec = 0;
let timerId = null;

// 1秒ごとにcount_down関数呼び出す
function count_start(){
      baseCount = 5;
      console.log(baseCount);
      min = parseInt(baseCount/60);
      sec = baseCount % 60;
      let timedisplay = document.getElementById('timedisplay');
      timedisplay.innerText = ('0' + min).slice(-2) + ':' + ('0' + sec).slice(-2)
  timerId = setInterval(count_down,1000);
}
// カウントダウン表示
function count_down(){
  if(baseCount ===0){
    let display = document.getElementById('timedisplay');
    display.innerText = 'TIME UP';
  }else {
      baseCount--;
      min = parseInt(baseCount/60);
      sec = baseCount % 60;
      let count_down = document.getElementById('timedisplay');
      count_down.innerText = ('0' + min).slice(-2) + ':' + ('0' + sec).slice(-2)
    }
  }

// ストップボタンクリック時のアクション
function count_stop(){
  clearInterval(timerId);
}
// リセットボタンクリック時のアクション
function count_reset(){
  baseCount = 0000;
  min = parseInt(baseCount/60);
  sec = baseCount % 60;
  let count_down = document.getElementById('timedisplay');
  count_down.innerText = ('0' + min).slice(-2) + ':' + ('0' + sec).slice(-2)
}
// イベント処理を実行
window.addEventListener('DOMContentLoaded', function(){
  let start = document.getElementById('startBtn');
  let stop  = document.getElementById('stopBtn');
  let reset = document.getElementById('resetBtn');
  start.addEventListener('click',count_start);
  stop.addEventListener('click',count_stop);
  reset.addEventListener('click',count_reset);
})
// 1押した時
function btnOneClick() {
    target = document.getElementById('timedisplay');
    const base = target.innerText.replace(':','');
    const newDisplay = base.substr(1,3)+ '1';
    const a = newDisplay.slice(0,2);
    const b = ':';
    const c = newDisplay.slice(2);
    let nnDisplay = a + b + c;
    console.log(nnDisplay);
    document.getElementById('timedisplay').textContent = nnDisplay;
    target.innerText = nnDisplay;
  };
// 2を押した時(3以降は割愛)
  function btnTwoClick() {
    target = document.getElementById('timedisplay');
    const base = target.innerText.replace(':','');
    const newDisplay = base.substr(1,3)+ '2';
    const a = newDisplay.slice(0,2);
    const b = ':';
    const c = newDisplay.slice(2);
    let nnDisplay = a + b + c;
    console.log(nnDisplay);
    document.getElementById('timedisplay').textContent = nnDisplay;
    target.innerText = nnDisplay;
  };
 

自分で試したこと

現状、「//1秒ごとにcount_down関数呼び出す」のところに5秒を無理やり入れているので、5秒のカウントダウンはしてくれます。
でも、本当は任意の数字を入力して、それでカウントダウンを発動したいです。

0

3Answer

とりあえず、現状00:00という形式で表示されているものを秒数に換算してbaseCountに入れたいのであれば、

baseCount = 5;

としている部分を

baseCount = document.getElementById('timedisplay').textContent.split(':').reduce((a, b) => + b + a * 60);

に変更するのが早いかな、と思います。

1Like

Comments

  1. @limemint

    Questioner

    バッチリできました! 
    ありがとうございます。

    もし、こちらのコメントを見ていただけたら再度質問があるのですが、よろしいでしょうか?
    splitもreduceも初めて見たので併せてご解説いただけたら嬉しいです。
    splitは、「:」の部分で「00:00」を区切っている、というところは調べてわかったのですが、reduce以降がわかりません。
    仮に「11:22」という表示だったとすると、a=11、b=22で「+22+11*60」ということになっているということでしょうか? これでなぜちゃんとした表示になるのでしょうか? bの前にも+は必要なのですか?

追記質問について

reduce()についての詳しい説明は Array.prototype.reduce() も見ていだだけるとありがたいのですが、簡単に言えば配列の中身を順に取り出し、その値で何らかの計算を行い、その結果に対してまた次の値で計算し、配列の値全てに対しての処理が終わったらその結果を返す、ということをしています。

今回の '分:秒' の秒数変換であればreduce()は使わず、単純に「分」と「秒」に分けて

const array = document.getElementById('timedisplay').textContent.split(':');
const minute = array[0];
const second = array[1];
baseCount = + second + minute * 60;

としてもよかったのですが、仮に元の値が '時:分:秒' というように「時」まで含むようになったとしてもそのまま対応できるよう、reduce()を使ってみました。

bの前にも+は必要なのですか?

元が文字列ですので、文字列での結合ではなく数値での加算となるよう、最初に 単項プラス + をつけて文字列型から数値型への変換をしています。

1Like

Comments

  1. @limemint

    Questioner

    詳しい解説、そして迅速なご対応をありがとうございます。
    熟読して今後の学習に役立てたいと思います。

おわかりになる方がいらっしゃったら教えて下さい。
投稿した質問に回答がついて、やりたかった事自体はできたのですが、そのコードの意味がわからないので教えていただければと思います。

私の質問に対しての回答についてです。

splitもreduceも初めて見たのでご解説いただけたら嬉しいです。
splitは、「:」の部分で「00:00」を区切っている、というところは調べてわかったのですが、reduce以降がわかりません。
仮に「11:22」という表示だったとすると、a=11、b=22で「+22+11*60」ということになっているということでしょうか? これでなぜちゃんとした表示になるのでしょうか? bの前にも+は必要なのですか?

0Like

Your answer might help someone💌