Đồng hồ đếm ngược JavaScript đơn giản nhất có thể? [đóng cửa]


240

Chỉ muốn hỏi làm thế nào để tạo ra đồng hồ đếm ngược đơn giản nhất có thể.

Sẽ có một câu trên trang web nói rằng:

"Đăng ký đóng cửa sau 05:00 phút!"

Vì vậy, những gì tôi muốn làm là tạo một bộ đếm thời gian đếm ngược js đơn giản đi từ "05:00" đến "00:00" và sau đó đặt lại thành "05:00" khi nó kết thúc.

Tôi đã trải qua một số câu trả lời trước đây, nhưng tất cả chúng dường như quá mãnh liệt (Đối tượng ngày, v.v.) cho những gì tôi muốn làm.


4
Và một lần nữa, bạn đang bỏ qua HTML có liên quan, mặc dù ít nhất bạn đã giải thích vấn đề phức tạp lần này. Nhưng nghiêm túc, bạn cần phải tự mình tìm ra giải pháp , sau đó đến và hỏi chúng tôi về những vấn đề bạn gặp phải.
David nói phục hồi lại

Mã ví dụ với khiếu nại về cách chúng quá phức tạp? Dù sao, tôi nghĩ rằng bạn có thể dễ dàng setIntervalvà làm cho nó .innerHTML dựa trên, thay vì dựa trên ngày.
bjb568

1
Vâng, mọi người nên tìm kiếm giải pháp cho mình. Nhưng với javaScript, có rất nhiều ví dụ về thực hiện các tác vụ phổ biến. Tôi biết cách thực hiện đồng hồ đếm ngược, nhưng tôi thích nếu tôi tìm thấy một trang web (như một thành phần). Vì vậy, nhờ câu hỏi này và câu trả lời mở rộng, tôi đã tìm thấy những gì tôi đang tìm kiếm. Logic đếm ngược
Carlos Rafael Ramirez

2
Tôi thấy các giải pháp này đơn giản hơn: stackoverflow.com/questions
32141035 / từ

Câu trả lời:


490

Tôi có hai bản demo, một có jQueryvà một không có. Không sử dụng các hàm ngày và đơn giản như nó được.

Bản trình diễn với JavaScript vani

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>

Bản trình diễn với 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);
});

Tuy nhiên, nếu bạn muốn một bộ đếm thời gian chính xác hơn chỉ phức tạp hơn một chút:

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>

Bây giờ chúng tôi đã thực hiện một vài bộ tính giờ khá đơn giản, chúng tôi có thể bắt đầu suy nghĩ về khả năng sử dụng lại và tách các mối quan tâm. Chúng ta có thể làm điều này bằng cách hỏi "đồng hồ đếm ngược nên làm gì?"

  • Có nên đếm ngược thời gian đếm ngược? Đúng
  • Bộ đếm thời gian đếm ngược có nên biết cách hiển thị trên DOM không? Không
  • Bộ đếm thời gian đếm ngược có nên tự khởi động lại khi nó về 0 không? Không
  • Có nên hẹn giờ đếm ngược cung cấp một cách để khách hàng truy cập bao nhiêu thời gian còn lại? Đúng

Vì vậy, với những điều này trong tâm trí, hãy viết tốt hơn (nhưng vẫn rất đơn giản) 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
  };
};

Vậy tại sao việc thực hiện này tốt hơn những người khác? Dưới đây là một số ví dụ về những gì bạn có thể làm với nó. Lưu ý rằng tất cả trừ ví dụ đầu tiên không thể đạt đượcstartTimer hàm.

Một ví dụ hiển thị thời gian ở định dạng XX: XX và khởi động lại sau khi đạt 00:00

Một ví dụ hiển thị thời gian ở hai định dạng khác nhau

Một ví dụ có hai bộ định thời khác nhau và chỉ có một lần khởi động lại

Một ví dụ bắt đầu đồng hồ đếm ngược khi nhấn nút


2
Bạn là đàn ông! Đó chính xác là những gì tôi đang tìm kiếm. Cảm ơn bạn! Một điều nữa: làm thế nào tôi có thể thêm "0" trước vài phút, để nó hiển thị "04:59", thay vì "4:59"?
Bartek 16/12/13

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

8
@timbram ban đầu nó trông cũng kỳ lạ đối với tôi, cho đến khi tôi nhận ra rằng dấu phẩy sau khi varkhai báo tách các khai báo khác nhau. vì vậy minutessecondschỉ đơn giản là các biến được khai báo (nhưng không khởi tạo). vì vậy timerchỉ đơn giản là chỉ bằng durationtham số, không hơn, không kém.
abustamam

2
@SinanErdem Tôi đã viết một số mã thực hiện điều này. Tôi có thể thêm mã đó vào câu trả lời sau ngày hôm nay. Tôi sẽ ping bạn khi điều này được thực hiện.
robbmj

3
Làm thế nào để bạn thêm một tùy chọn thiết lập lại? Và cũng là một sự tạm dừng và tiếp tục? Tôi đã thử thêm một trường this.reset và kiểm tra xem trong bao đóng. Nhưng đồng hồ vẫn tiếp tục mặc dù.
Dzung Nguyễn

24

Nếu bạn muốn một bộ đếm thời gian thực, bạn cần sử dụng đối tượng ngày.

Tính hiệu số.

Định dạng chuỗi của bạn.

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);
      })();
}

Thí dụ

Jsfiddle

hẹn giờ không chính xác

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);

JsFiddle


16

Bạn có thể dễ dàng tạo chức năng hẹn giờ bằng cách sử dụng setInterval.Below là mã mà bạn có thể sử dụng nó để tạo bộ hẹn giờ.

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
Không thể hiện chính xác từng giây, nó đếm ngược quá nhanh.
Scott Rowley

4
Thay đổi 500 thành 1000 dường như làm cho nó chính xác.
Scott Rowley

Giải pháp
khéo léo
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.