가장 간단한 JavaScript 카운트 다운 타이머? [닫은]


240

가장 간단한 카운트 다운 타이머를 만드는 방법을 묻고 싶었습니다.

사이트에 다음과 같은 문장이 있습니다.

"등록은 05:00 분 안에 종료됩니다!"

그래서 내가하고 싶은 것은 "05:00"에서 "00:00"으로 이동 한 다음 "05:00"으로 재설정되는 간단한 js 카운트 다운 타이머를 만드는 것입니다.

나는 전에 몇 가지 대답을 겪었지만, 내가하고 싶은 일에 대해 너무 강렬하게 보입니다 (날짜 개체 등).


4
그리고 다시, 당신은 관련 HTML을 배제하고 있지만, 이번에는 복잡성 문제를 설명했습니다. 그러나 진지하게, 당신 은 스스로 솔루션을 만드는 것을 조사한 다음 , 우리에게 와서 당신이 겪고있는 문제에 대해 질문해야합니다.
다윗은 분석 재개 모니카 말한다

너무 복잡한 방법에 대한 불만이있는 코드 예제? 어쨌든, setInterval날짜 기반이 아닌 .innerHTML 기반으로 쉽게 만들 수 있다고 생각합니다 .
bjb568

1
그렇습니다. 사람들은 스스로 해결책을 찾아야합니다. 그러나 자바 스크립트에는 일반적인 작업을 수행하는 많은 예가 있습니다. 카운트 다운 타이머를 수행하는 방법을 알고 있지만 웹에서 구성 요소와 같은 타이머를 찾는 것이 좋습니다. 따라서이 질문과 광범위한 답변 덕분에 내가 찾던 것을 발견했습니다. 카운트 다운 로직
Carlos Rafael Ramirez

2
이 솔루션이 더 간단하다는 것을 알았습니다. stackoverflow.com/questions/32141035/…
nu everest

답변:


490

나는 두 가지 데모를 가지고 있습니다 jQuery. 날짜 함수도 사용하지 않으며 간단합니다.

바닐라 JavaScript를 사용한 데모

function startTimer(duration, display) {
    var timer = duration, minutes, seconds;
    setInterval(function () {
        minutes = parseInt(timer / 60, 10);
        seconds = parseInt(timer % 60, 10);

        minutes = minutes < 10 ? "0" + minutes : minutes;
        seconds = seconds < 10 ? "0" + seconds : seconds;

        display.textContent = minutes + ":" + seconds;

        if (--timer < 0) {
            timer = duration;
        }
    }, 1000);
}

window.onload = function () {
    var fiveMinutes = 60 * 5,
        display = document.querySelector('#time');
    startTimer(fiveMinutes, display);
};
<body>
    <div>Registration closes in <span id="time">05:00</span> minutes!</div>
</body>

jQuery로 데모

function startTimer(duration, display) {
    var timer = duration, minutes, seconds;
    setInterval(function () {
        minutes = parseInt(timer / 60, 10);
        seconds = parseInt(timer % 60, 10);

        minutes = minutes < 10 ? "0" + minutes : minutes;
        seconds = seconds < 10 ? "0" + seconds : seconds;

        display.text(minutes + ":" + seconds);

        if (--timer < 0) {
            timer = duration;
        }
    }, 1000);
}

jQuery(function ($) {
    var fiveMinutes = 60 * 5,
        display = $('#time');
    startTimer(fiveMinutes, display);
});

그러나 약간 더 복잡한 타이머를 원한다면 더 복잡합니다.

function startTimer(duration, display) {
    var start = Date.now(),
        diff,
        minutes,
        seconds;
    function timer() {
        // get the number of seconds that have elapsed since 
        // startTimer() was called
        diff = duration - (((Date.now() - start) / 1000) | 0);

        // does the same job as parseInt truncates the float
        minutes = (diff / 60) | 0;
        seconds = (diff % 60) | 0;

        minutes = minutes < 10 ? "0" + minutes : minutes;
        seconds = seconds < 10 ? "0" + seconds : seconds;

        display.textContent = minutes + ":" + seconds; 

        if (diff <= 0) {
            // add one second so that the count down starts at the full duration
            // example 05:00 not 04:59
            start = Date.now() + 1000;
        }
    };
    // we don't want to wait a full second before the timer starts
    timer();
    setInterval(timer, 1000);
}

window.onload = function () {
    var fiveMinutes = 60 * 5,
        display = document.querySelector('#time');
    startTimer(fiveMinutes, display);
};
<body>
    <div>Registration closes in <span id="time"></span> minutes!</div>
</body>

이제 몇 가지 간단한 타이머를 만들었으므로 재사용 성 및 분리 문제에 대해 생각할 수 있습니다. "카운트 다운 타이머는 어떻게해야합니까?"

  • 카운트 다운 타이머가 카운트 다운되어야합니까?
  • 카운트 다운 타이머가 DOM에 자신을 표시하는 방법을 알아야합니까? 아니
  • 카운트 다운 타이머가 0에 도달하면 스스로 다시 시작해야합니까? 아니
  • 카운트 다운 타이머는 클라이언트가 남은 시간에 액세스 할 수있는 방법을 제공해야합니까?

따라서 이러한 점을 염두에두고 더 잘 작성하십시오 (하지만 여전히 매우 간단합니다). CountDownTimer

function CountDownTimer(duration, granularity) {
  this.duration = duration;
  this.granularity = granularity || 1000;
  this.tickFtns = [];
  this.running = false;
}

CountDownTimer.prototype.start = function() {
  if (this.running) {
    return;
  }
  this.running = true;
  var start = Date.now(),
      that = this,
      diff, obj;

  (function timer() {
    diff = that.duration - (((Date.now() - start) / 1000) | 0);

    if (diff > 0) {
      setTimeout(timer, that.granularity);
    } else {
      diff = 0;
      that.running = false;
    }

    obj = CountDownTimer.parse(diff);
    that.tickFtns.forEach(function(ftn) {
      ftn.call(this, obj.minutes, obj.seconds);
    }, that);
  }());
};

CountDownTimer.prototype.onTick = function(ftn) {
  if (typeof ftn === 'function') {
    this.tickFtns.push(ftn);
  }
  return this;
};

CountDownTimer.prototype.expired = function() {
  return !this.running;
};

CountDownTimer.parse = function(seconds) {
  return {
    'minutes': (seconds / 60) | 0,
    'seconds': (seconds % 60) | 0
  };
};

그렇다면 왜이 구현이 다른 구현보다 낫습니까? 여기 당신이 할 수있는 몇 가지 예가 있습니다. 첫 번째 예제를 제외한 모든 startTimer기능을 함수 로 수행 할 수는 없습니다 .

시간을 XX : XX 형식으로 표시하고 00:00에 도달 한 후 다시 시작하는 예

두 가지 형식으로 시간을 표시하는 예

두 개의 다른 타이머가 있고 한 번만 다시 시작하는 예

버튼을 눌렀을 때 카운트 다운 타이머를 시작하는 예


2
당신은 남자입니다! 바로 내가 찾던 것입니다. 감사합니다! 한 가지 더 : 몇 분 전에 "0"을 추가하여 "4:59"대신 "04:59"를 표시하려면 어떻게해야합니까?
Bartek

1
minutes = minutes < 10 ? "0" + minutes : minutes;
robbmj

8
@timbram var선언 후 쉼표가 다른 선언을 분리 한다는 것을 깨달을 때까지 처음에는 나에게 이상하게 보였습니다 . 그렇게 minutes하고 seconds단순히 선언 (그러나 유엔 초기화) 변수를하고 있습니다. 그래서 timer그냥 평등하지 단순히 duration덜 매개 변수, 아무것도 더 아무것도.
abustamam

2
@SinanErdem 나는 이것을하는 코드를 작성했다. 오늘 나중에 그 코드를 답변에 추가 할 수 있습니다. 이 작업이 완료되면 핑합니다.
robbmj

3
재설정 옵션을 어떻게 추가합니까? 또한 일시 중지 및 재개? this.reset 필드를 추가하고 클로저에서 확인하십시오. 그러나 시계는 계속 진행됩니다.
Dzung Nguyen

24

실제 타이머를 원하면 날짜 객체를 사용해야합니다.

차이를 계산하십시오.

문자열을 포맷하십시오.

window.onload=function(){
      var start=Date.now(),r=document.getElementById('r');
      (function f(){
      var diff=Date.now()-start,ns=(((3e5-diff)/1e3)>>0),m=(ns/60)>>0,s=ns-m*60;
      r.textContent="Registration closes in "+m+':'+((''+s).length>1?'':'0')+s;
      if(diff>3e5){
         start=Date.now()
      }
      setTimeout(f,1e3);
      })();
}

JS 피들

정확하지 않은 타이머

var time=5*60,r=document.getElementById('r'),tmp=time;

setInterval(function(){
    var c=tmp--,m=(c/60)>>0,s=(c-m*60)+'';
    r.textContent='Registration closes in '+m+':'+(s.length>1?'':'0')+s
    tmp!=0||(tmp=time);
},1000);

JS 피들


16

setInterval을 사용하여 타이머 기능을 쉽게 만들 수 있습니다. 아래는 타이머를 만드는 데 사용할 수있는 코드입니다.

http://jsfiddle.net/ayyadurai/GXzhZ/1/

window.onload = function() {
  var minute = 5;
  var sec = 60;
  setInterval(function() {
    document.getElementById("timer").innerHTML = minute + " : " + sec;
    sec--;
    if (sec == 00) {
      minute --;
      sec = 60;
      if (minute == 0) {
        minute = 5;
      }
    }
  }, 1000);
}
Registration closes in <span id="timer">05:00<span> minutes!


3
초를 정확하게 나타내지 않으면 너무 빨리 카운트 다운됩니다.
Scott Rowley

4
500을 1000으로 바꾸면 정확한 것으로 보입니다.
Scott Rowley

혼란을 피하기 위해 매끄러운 솔루션, 시간을 분으로 변경해야 함
embulldogs99
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.