Ich habe zwei Demos, eine mit jQuery
und eine ohne. Weder verwenden Datumsfunktionen und sind so einfach wie es nur geht.
Demo mit Vanille 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>
Demo mit 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);
});
Wenn Sie jedoch einen genaueren Timer wünschen, der nur geringfügig komplizierter ist:
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>
Nachdem wir einige ziemlich einfache Timer erstellt haben, können wir über die Wiederverwendbarkeit und die Trennung von Bedenken nachdenken. Wir können dies tun, indem wir fragen: "Was soll ein Countdown-Timer tun?"
- Sollte ein Countdown-Timer herunterzählen? Ja
- Sollte ein Countdown-Timer wissen, wie er sich im DOM anzeigt? Nein
- Sollte ein Countdown-Timer wissen, dass er sich neu startet, wenn er 0 erreicht? Nein
- Sollte ein Countdown-Timer einem Client die Möglichkeit bieten, auf die verbleibende Zeit zuzugreifen? Ja
In Anbetracht dieser Dinge können wir also ein besseres (aber immer noch sehr einfaches) schreiben. 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
};
};
Warum ist diese Implementierung besser als die anderen? Hier sind einige Beispiele, was Sie damit machen können. Beachten Sie, dass die startTimer
Funktionen bis auf das erste Beispiel nicht alle erreichen können.
Ein Beispiel, das die Uhrzeit im XX: XX-Format anzeigt und nach Erreichen von 00:00 neu startet
Ein Beispiel, das die Uhrzeit in zwei verschiedenen Formaten anzeigt
Ein Beispiel mit zwei verschiedenen Timern und nur einem Neustart
Ein Beispiel, das den Countdown-Timer startet, wenn eine Taste gedrückt wird