ikon0518
@ikon0518 (o mi)

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

カウントダウンタイマーを1つのページに複数つけたい

Q&A

Closed

解決したいこと

リンクを開いたら24時間カウントダウンタイマーが始まるようにしましたが、
1つのページに3つつけたいのですが、2つ以上つけると1つしか動かなくなってしまいます。
全てを同じように動かすにはどうしたらいいか教えていただきたいです。

発生している問題・エラー

2つ目から動かなくなってしまいます。

または、問題・エラーが起きている画像をここにドラッグアンドドロップ

<div id="timer_body"><h2 id="timer"></h2></div>

<style>

    #timer_body{
        background-color: #FFF500 !important;/*背景色の設定*/
        z-index: 9999 !important;
        width: 750px !important;
    }

    #timer{


        font-weight: bold ; /*文字の太さを設定*/


        font-size: 70px ; /*文字の大きさを設定*/


        color: #e82c2c ;/*文字の色を設定*/        

        text-align: center;
        font-family: Sans-Serif;
    }
    
</style>
<script>
    
var interval = 10; //更新のインターバル設定

var cook;
var cStart2,cEnd2;
var endtime;
cook=document.cookie + ";";
  cStart2 = cook.indexOf("END2=",0);

  if (cStart2 == -1){
    var endDate = new Date();


    /**
     * 日付を設定します。
     * タイマーの時間設定ができます。
     * 上から順に、日、時、分、秒を入力できます。
     * 
     * ※時、分、秒がそれぞれ24(時間)、60(秒、分)を超える場合(例2時間後や1日後など)は
     * 「60」や「24」と入力してください。
     * また使われないものがある場合(例2時間後の場合、日を設定しない)は
     * 「1」と入力してください
     * 
     * 
     * 2日後にタイマーをセットする場合。
     * 上から順に、「2」、「60」、「60」、「60」
     * 
     * 4時間後にタイマーをセットする場合
     * 上から順に、「1」、「4」、「60」、「60」
     * */

    var settimeday = 1; //日数を設定

    var settimehour = 24; //時間を設定

    var settimeminutes = 60; //分数を設定

    var settimeseconds = 60; //秒数を設定



    var endDateAfter = new Date(endDate.getTime() + (1000 * settimeseconds * settimeminutes * settimehour * settimeday));




    endDate.setTime(endDate.getTime() + (1000 * 60 * 60 * 24 * 2));
    var mem = endDate.toGMTString();
    document.cookie = "END2=" + endDateAfter + ";expires=" + mem;

    endtime = endDateAfter;
  } else {
    cEnd2 = cook.indexOf(";", cStart2);
    endtime = cook.substring(cStart2 + 5, cEnd2);
    endtime = Date.parse(endtime); 
  }
  
function countdownTimer(){
  var nowDate = new Date();
  var period = endtime - nowDate;
  var addZero = function(n){return('0'+n).slice(-2);} 
  
  if(period > 0) {
  var day = Math.floor(period / (1000 * 60 * 60 * 24));
  period -=  (day *(1000 * 60 * 60 * 24));
  var hour = Math.floor(period / (1000 * 60 * 60));
  period -= (hour *(1000 * 60 * 60));
  var minutes =  Math.floor(period / (1000 * 60));
  period -= (minutes * (1000 * 60));
  var second = Math.floor(period / 1000);
  var millsecond = Math.floor(period / 10);
  var insert = "";
 
  insert += '<span class="h">' + addZero(hour) + ':' + '</span>';
  insert +=  '<span class="m">' + addZero(minutes) +':' + '<span>';
  insert += '<span class="s">' + addZero(second) +':' + '<span>';
  insert += '<span class="ms">' + addZero(millsecond) + '<span>';
  document.getElementById('timer').innerHTML = insert;
  setTimeout(countdownTimer, interval); 
  } else {
    var insert = "";



    var text = "まもなく受付を終了致します。";//文章を設定




    insert += '<span>' + text + '<span>';
    document.getElementById('timer').innerHTML = insert;




    var urlset = 'https://www.kigyodrill.com/';//URLを設定




    setTimeout(function(){window.location.href = urlset;}, 5*1000);
  }
}
countdownTimer();
    
</script>

2つ目以降

<h2 id="timer"></h2>
1

3Answer

document.getElementById('timer').innerHTML = insert; で最初に見つかったひとつのtimerにだけセットしているので、1つしか動かないですね。
すべてのtimerエレメントを列挙して、それぞれにセットする必要がありそうです。

タイマーを3か所に表示する例:

<div id="timer_body">
  <h2 id="timer"></h2>
</div>
<div id="timer_body">
  <h2 id="timer"></h2>
</div>
<div id="timer_body">
  <h2 id="timer"></h2>
</div>

<style>
  #timer_body {
    background-color: #FFF500 !important;
    /*背景色の設定*/
    z-index: 9999 !important;
    width: 750px !important;
  }

  #timer {
    font-weight: bold;
    /*文字の太さを設定*/
    font-size: 70px;
    /*文字の大きさを設定*/
    color: #e82c2c;
    /*文字の色を設定*/
    text-align: center;
    font-family: Sans-Serif;
  }
</style>

<script>
  var interval = 10; //更新のインターバル設定
  var cook;
  var cStart2, cEnd2;
  var endtime;
  cook = document.cookie + ";";
  cStart2 = cook.indexOf("END2=", 0);
  if (cStart2 == -1) {
    var endDate = new Date();
    /**
     * 日付を設定します。
     * タイマーの時間設定ができます。
     * 上から順に、日、時、分、秒を入力できます。
     * 
     * ※時、分、秒がそれぞれ24(時間)、60(秒、分)を超える場合(例2時間後や1日後など)は
     * 「60」や「24」と入力してください。
     * また使われないものがある場合(例2時間後の場合、日を設定しない)は
     * 「1」と入力してください
     * 
     * 
     * 2日後にタイマーをセットする場合。
     * 上から順に、「2」、「60」、「60」、「60」
     * 
     * 4時間後にタイマーをセットする場合
     * 上から順に、「1」、「4」、「60」、「60」
     * */
    var settimeday = 1; //日数を設定
    var settimehour = 24; //時間を設定
    var settimeminutes = 60; //分数を設定
    var settimeseconds = 60; //秒数を設定
    var endDateAfter = new Date(endDate.getTime() + (1000 * settimeseconds * settimeminutes * settimehour * settimeday));
    endDate.setTime(endDate.getTime() + (1000 * 60 * 60 * 24 * 2));
    var mem = endDate.toGMTString();
    document.cookie = "END2=" + endDateAfter + ";expires=" + mem;
    endtime = endDateAfter;
  } else {
    cEnd2 = cook.indexOf(";", cStart2);
    endtime = cook.substring(cStart2 + 5, cEnd2);
    endtime = Date.parse(endtime);
  }

  function countdownTimer() {
    var nowDate = new Date();
    var period = endtime - nowDate;
    var addZero = function(n) {
      return ('0' + n).slice(-2);
    }
    if (period > 0) {
      var day = Math.floor(period / (1000 * 60 * 60 * 24));
      period -= (day * (1000 * 60 * 60 * 24));
      var hour = Math.floor(period / (1000 * 60 * 60));
      period -= (hour * (1000 * 60 * 60));
      var minutes = Math.floor(period / (1000 * 60));
      period -= (minutes * (1000 * 60));
      var second = Math.floor(period / 1000);
      var millsecond = Math.floor(period / 10);
      var insert = "";
      insert += '<span class="h">' + addZero(hour) + ':' + '</span>';
      insert += '<span class="m">' + addZero(minutes) + ':' + '<span>';
      insert += '<span class="s">' + addZero(second) + ':' + '<span>';
      insert += '<span class="ms">' + addZero(millsecond) + '<span>';
      for (let timer of document.querySelectorAll('[id="timer"]')) {
        timer.innerHTML = insert;
      }
      setTimeout(countdownTimer, interval);
    } else {
      var insert = "";
      var text = "まもなく受付を終了致します。"; //文章を設定
      insert += '<span>' + text + '<span>';
      for (let timer of document.querySelectorAll('[id="timer"]')) {
        timer.innerHTML = insert;
      }
      var urlset = 'https://www.kigyodrill.com/'; //URLを設定
      setTimeout(function() {
        window.location.href = urlset;
      }, 5 * 1000);
    }
  }
  
  countdownTimer();
</script>
1Like

Comments

  1. @ikon0518

    Questioner

    アドバイスいただきありがとうございます!
    下記コードを入力しましたが、表示されません...
    何か間違っていますでしょうか?
    また、1つ目に書いたコードを2つ目以降にコピペでもだめでした...
    ```
    <h2 id="timer"></h2>

    <script>


    document.getElementById('timer').innerHTML = insert;



    </script>
    ```
  2. document.getElementById('timer') は最初に見つかった1つだけですよ。
    2つ目は取り出されません。
  3. 同じタイマーを3か所に表示するコードを追記しました。
  4. @ikon0518

    Questioner

    細かく教えていただき、コードまでありがとうございます🙇
    querySelectorAllで全て表示されました!!!
    本当にありがとうございます😭

setTimeoutでcountdownTimerにカウントダウンの引数を与えてみてはどうでしょうか?

var interval = 10
function countdownTimer(downTime){
  ・・・・
    if ( downTime > 0 ) {
       downTime -= interval 
       setTimeout(countdownTimer, interval * 1000 , downTime); 
    }

setTimeoutはミリ秒

1Like

Comments

  1. @ikon0518

    Questioner

    アドバイスしていただきありがとうございます!!上記の方の回答で解決することができました。
    書いていただいたコードも参考に勉強します!
    ありがとうございました🙇‍♂️

かなり端折った処理ですが、一例としてこんな感じでも複数のカウントダウンを行なえます。

index.html
<style>
div {
  background-color: #8f8;
  margin: 5px;
}
.end {
  color: white;
  background-color: #f00;
}
</style>

<body>
<div id='t1'></div>
<div id='t2'></div>
<div id='t3'></div>

<script>
'use strict';
const format = time => new Date(time).toJSON().slice(11, 22);

const setCountdownTimer = (id, time) => {
  const element = document.getElementById(id);
  if(!element) return;

  const endTime = Date.now() + time * 1000;
  const loop = () => {
    element.textContent = format(endTime - Date.now());
    if(endTime > Date.now()) {
      requestAnimationFrame(loop);
    }
    else {
      element.textContent = format(0);
      element.classList.add('end');
    }
  };
  loop();
};

setCountdownTimer('t1', 36000); // 10時間
setCountdownTimer('t2', 300);  // 5分
setCountdownTimer('t3', 10); // 10秒
</script>
</body>
1Like

Comments

  1. @ikon0518

    Questioner

    今回もアドバイスしていただきありがとうございます!🙇‍♂️
    このように短く書く方法もあるのですね!こちらも参考に色々試してみます!
    ありがとうございました🙇‍♂️

Your answer might help someone💌