Skip to content

Instantly share code, notes, and snippets.

Embed
What would you like to do?
$ = 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);
@acdha

This comment has been minimized.

Copy link

commented Jul 29, 2013

Date.now might be preferable to churning Date 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:

var maxDelta = Math.floor(TIMEOUT * 1.1);
…
if (currentTime - lastTime > maxDelta) {
…
@guidobouman

This comment has been minimized.

Copy link

commented Jul 30, 2013

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.

@rbrcurtis

This comment has been minimized.

Copy link

commented May 27, 2014

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

@vinnymac

This comment has been minimized.

Copy link

commented Sep 12, 2014

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.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
You can’t perform that action at this time.