idle-timer.0.9.3.js 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144
  1. /*! Idle Timer - v0.9.2 - 2013-08-04
  2. * https://github.com/mikesherov/jquery-idletimer
  3. * Copyright (c) 2013 Paul Irish; Licensed MIT */
  4. ( function( $ ) {
  5. $.idleTimer = function( firstParam, elem, opts ) {
  6. // defaults that are to be stored as instance props on the elem
  7. opts = $.extend( {
  8. startImmediately: true, //starts a timeout as soon as the timer is set up
  9. idle: false, //indicates if the user is idle
  10. enabled: true, //indicates if the idle timer is enabled
  11. timeout: 30000, //the amount of time (ms) before the user is considered idle
  12. events: "mousemove keydown DOMMouseScroll mousewheel mousedown touchstart touchmove" // activity is one of these events
  13. }, opts );
  14. elem = elem || document;
  15. var jqElem = $( elem ),
  16. obj = jqElem.data("idleTimerObj") || {},
  17. /* (intentionally not documented)
  18. * Toggles the idle state and fires an appropriate event.
  19. * @return {void}
  20. */
  21. toggleIdleState = function( myelem ) {
  22. // curse you, mozilla setTimeout lateness bug!
  23. if ( typeof myelem === "number" ) {
  24. myelem = undefined;
  25. }
  26. var obj = $.data( myelem || elem, "idleTimerObj" );
  27. //toggle the state
  28. obj.idle = !obj.idle;
  29. // reset timeout
  30. var elapsed = ( +new Date() ) - obj.olddate;
  31. obj.olddate = +new Date();
  32. // handle Chrome always triggering idle after js alert or comfirm popup
  33. if ( obj.idle && ( elapsed < opts.timeout ) ) {
  34. obj.idle = false;
  35. clearTimeout( $.idleTimer.tId );
  36. if ( opts.enabled ) {
  37. $.idleTimer.tId = setTimeout( toggleIdleState, opts.timeout );
  38. }
  39. return;
  40. }
  41. // create a custom event, but first, store the new state on the element
  42. // and then append that string to a namespace
  43. var event = $.Event( $.data( elem, "idleTimer", obj.idle ? "idle" : "active" ) + ".idleTimer" );
  44. $( elem ).trigger( event );
  45. },
  46. /**
  47. * Stops the idle timer. This removes appropriate event handlers
  48. * and cancels any pending timeouts.
  49. * @return {void}
  50. * @method stop
  51. * @static
  52. */
  53. stop = function( jqElem ) {
  54. var obj = jqElem.data("idleTimerObj") || {};
  55. //set to disabled
  56. obj.enabled = false;
  57. //clear any pending timeouts
  58. clearTimeout( obj.tId );
  59. //detach the event handlers
  60. jqElem.off(".idleTimer");
  61. };
  62. obj.olddate = obj.olddate || +new Date();
  63. if ( typeof firstParam === "number" ) {
  64. opts.timeout = firstParam;
  65. } else if ( firstParam === "destroy" ) {
  66. stop( jqElem );
  67. return this;
  68. } else if ( firstParam === "getElapsedTime" ) {
  69. return ( +new Date() ) - obj.olddate;
  70. }
  71. /* (intentionally not documented)
  72. * Handles a user event indicating that the user isn't idle.
  73. * @param {Event} event A DOM2-normalized event object.
  74. * @return {void}
  75. */
  76. jqElem.on( $.trim( ( opts.events + " " ).split(" ").join(".idleTimer ") ), function() {
  77. var obj = $.data( this, "idleTimerObj" );
  78. //clear any existing timeout
  79. clearTimeout( obj.tId );
  80. //if the idle timer is enabled
  81. if ( obj.enabled ){
  82. //if it's idle, that means the user is no longer idle
  83. if ( obj.idle ){
  84. toggleIdleState( this );
  85. }
  86. //set a new timeout
  87. obj.tId = setTimeout( toggleIdleState, obj.timeout );
  88. }
  89. });
  90. obj.idle = opts.idle;
  91. obj.enabled = opts.enabled;
  92. obj.timeout = opts.timeout;
  93. //set a timeout to toggle state. May wish to omit this in some situations
  94. if ( opts.startImmediately ) {
  95. obj.tId = setTimeout( toggleIdleState, obj.timeout );
  96. }
  97. // assume the user is active for the first x seconds.
  98. jqElem.data( "idleTimer", "active" );
  99. // store our instance on the object
  100. jqElem.data( "idleTimerObj", obj );
  101. };
  102. $.fn.idleTimer = function( firstParam, opts ) {
  103. // Allow omission of opts for backward compatibility
  104. if ( !opts ) {
  105. opts = {};
  106. }
  107. if ( this[0] ){
  108. return $.idleTimer( firstParam, this[0], opts );
  109. }
  110. return this;
  111. };
  112. })( jQuery );