-
-
Save maccman/5944646 to your computer and use it in GitHub Desktop.
$ = jQuery | |
TIMEOUT = 20000 | |
lastTime = (new Date()).getTime() | |
setInterval -> | |
currentTime = (new Date()).getTime() | |
# If timeout was paused (ignoring small | |
# variations) then trigger the 'wake' event | |
if currentTime > (lastTime + TIMEOUT + 2000) | |
$(document).wake() | |
lastTime = currentTime | |
, TIMEOUT | |
$.fn.wake = (callback) -> | |
if typeof callback is 'function' | |
$(this).on('wake', callback) | |
else | |
$(this).trigger('wake', arguments...) |
(function($){ | |
var TIMEOUT = 20000; | |
var lastTime = (new Date()).getTime(); | |
setInterval(function() { | |
var currentTime = (new Date()).getTime(); | |
if (currentTime > (lastTime + TIMEOUT + 2000)) { | |
$(document).wake(); | |
} | |
lastTime = currentTime; | |
}, TIMEOUT); | |
$.fn.wake = function(callback) { | |
if (typeof callback === 'function') { | |
return $(this).on('wake', callback); | |
} else { | |
return $(this).trigger('wake'); | |
} | |
}; | |
})(jQuery); |
Good point on the Date.now case: http://jsperf.com/date-now-vs-date-gettime
I prefer the currentTime > (lastTime + TIMEOUT + 2000)
notation though. Much more readable.
Apparently many browsers will pause setInterval when the browser window isn't focused, whichmeans this will trigger wake any time you focus another window for more than ~22 seconds. or am I misunderstanding something?
http://www.goat1000.com/2011/03/23/how-accurate-is-window.setinterval.html
It appears that some do. Chrome/Firefox limit the setInterval time to around 1000 ms. IE/Safari/Opera have no restrictions. However, according to this that may not be true on iOS. For a more in depth explanation read this StackOverflow Post.
WakeUp is a jQuery library that does the same thing. I recommend combining this with the changes recommended by acdha above.
Date.now
might be preferable to churningDate
instances. It's probably advisable to cache$(document)
as well, although it's not called anywhere near as frequently.I generally also prefer to simplify the math to avoid needing to repeat part of the calculation and bury the slop factor down in the implementation: