Skip to content

Instantly share code, notes, and snippets.

@tlux
Last active August 29, 2015 14:11
Show Gist options
  • Select an option

  • Save tlux/47b23c0f5f1cd6358a5b to your computer and use it in GitHub Desktop.

Select an option

Save tlux/47b23c0f5f1cd6358a5b to your computer and use it in GitHub Desktop.
Make elements timeoutable when no activity has been made for a number of seconds
# Requirements:
# - jQuery
# - UnderscoreJS
#
# Usage:
# $('#element').idleTimeoutable()
# $('#element').idleTimeoutable(after: 3000) # milliseconds
# $('#element').idleTimeoutable(idleClass: 'inactive')
TIMEOUT_STORE_KEY = 'idleTimeout'
DEFAULTS =
after: 5000
idleClass: 'idle'
awakeClass: null
idleOnInit: false
setIdle = ($element, options) ->
console.debug 'idle'
$element.addClass(options.idleClass).removeClass(options.awakeClass)
$element.trigger('idle')
$element.data('isIdle', true)
setAwake = ($element, options) ->
console.debug 'awaken'
$element.removeClass(options.idleClass).addClass(options.awakeClass)
$element.trigger('awake')
$element.removeData('isIdle')
isIdle = ($element) ->
$element.data('isIdle')
jQuery.fn.idleTimeoutable = (options = {}) ->
@each ->
$element = $(@)
elementOpts = _(_(options).defaults($element.data())).defaults(DEFAULTS)
if elementOpts.idleOnInit
setIdle($element, elementOpts)
else
setAwake($element, elementOpts)
timeout = $element.data(TIMEOUT_STORE_KEY)
startTimeout = ->
timeout = setTimeout ->
setIdle($element, elementOpts)
, elementOpts.after
$element.data(TIMEOUT_STORE_KEY, timeout)
timeout
awaken = ->
clearTimeout(timeout) if timeout
timeout = null
$element.removeData(TIMEOUT_STORE_KEY)
setAwake($element, elementOpts) if isIdle($element)
startTimeout()
$element.mousemove -> awaken()
$(document).keydown -> awaken()
startTimeout()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment