Saya punya dua demo, satu dengan jQuery
dan satu tanpa. Tidak menggunakan fungsi tanggal dan sesederhana mungkin.
Demo dengan JavaScript vanilla
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>
Demo dengan 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);
});
Namun, jika Anda menginginkan timer yang lebih akurat, itu hanya sedikit lebih rumit:
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>
Sekarang kami telah membuat beberapa penghitung waktu yang cukup sederhana, kami dapat mulai berpikir tentang kegunaan kembali dan memisahkan masalah. Kita dapat melakukan ini dengan bertanya "apa yang harus dilakukan penghitung waktu mundur?"
- Haruskah penghitung waktu mundur mundur? Iya
- Haruskah penghitung waktu mundur tahu cara menampilkan dirinya pada DOM? Tidak
- Haruskah penghitung waktu mundur tahu untuk memulai kembali sendiri ketika mencapai 0? Tidak
- Haruskah penghitung waktu mundur menyediakan cara bagi klien untuk mengakses berapa banyak waktu yang tersisa? Iya
Jadi dengan hal-hal ini dalam pikiran mari kita menulis yang lebih baik (tapi masih sangat sederhana) 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
};
};
Jadi mengapa implementasi ini lebih baik daripada yang lain? Berikut adalah beberapa contoh dari apa yang dapat Anda lakukan dengannya. Perhatikan bahwa semua kecuali contoh pertama tidak dapat dicapai oleh startTimer
fungsi.
Contoh yang menampilkan waktu dalam format XX: XX dan memulai kembali setelah mencapai 00:00
Contoh yang menampilkan waktu dalam dua format berbeda
Contoh yang memiliki dua timer berbeda dan hanya satu restart
Contoh yang memulai penghitung waktu mundur ketika tombol ditekan