I've written this little countdown script to count until the end of our school days.
Now, that was written quickly, badly remembering modulo from a few years ago, and I don't think that's very optimized.
I thought about updating only the seconds and check if it needs to update the minute too, etc. But it wouldn't be accurate as setTimeout
is not (depending if the browser lags, etc).
(function() {
//the variable block here seems kinda weird, but whatever toots your horn
var el = document.getElementById('countdown'),
endDate = new Date('March 30, 2012 18:10:00'),
curDate,
diff,
days,
hours,
minutes,
seconds,
tmp,
countdown,
//added Math.floor. this is already a shortcut, might as well make it a double one
pad = function(number) { return (number < 10 ? '0' : '') + Math.floor(number) },
//calculate these constants once, instead of over and over
minute = 60 * 1000,
hour = minute * 60,
day = hour * 24
;(function tick() {
curDate = new Date()
//you want the absolute value of this, not of individual calculations using this
diff = Math.abs(new Date(curDate.getTime() - endDate.getTime()))
days = diff / day
tmp = diff % day
hours = tmp / hour
tmp = tmp % hour
minutes = tmp / minute
tmp = tmp % minute
seconds = tmp / 1000
//parseInt was redundant
countdown = pad(days) + ':' + pad(hours) + ':' + pad(minutes) + ':' + pad(seconds)
if ( 'textContent' in el ) {
el.textContent = countdown
}
else {
el.innerText = countdown
}
//dont't use arguments.calle, it's deprecated
//simply use a named function expression
setTimeout(tick, 1000)
}())
}())
About the semicolons missing: it is a deliberate choice as I find this more readable (the ;
right before the (function()
is because it is the only edge case where the semicolon insertion doesn't work correctly).
el[('textContent' in el) ? 'textContent' : 'innerText'] = countdown
Also though, you can cache the result of that calculation \$\endgroup\$setInterval()
is far more optimized and is often recommended oversetTimeout()
. There is an awesome article by John Resig (inventor of jQuery and co-author of Secrets of the JavaScript Ninja). The book is amazing, I recommend it to everyone too! John Resig's blog \$\endgroup\$