Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to know browser idle time?

Tags:

How can I track the browser idle time? I am using IE8.

I am not using any session management and don't want to handle it on server side.

like image 853
BOSS Avatar asked Mar 05 '12 09:03

BOSS


People also ask

What is idle time in browser?

The idle time is the time that the user doesn't interact with a web-page. This interaction can be either moving the mouse, clicking on the page or using the keyboard. This time can be detected to execute certain events that may need to occur after a certain period of idle time.

What is idle timer expiration?

When a Microsoft Server idle session limit policy rule is configured , users experience an "Idle timer expired" dialog box which is displayed when a session is left idle for the group policy specified amount of time. Message: "Session has been idle over its time limit. It will be disconnected in 2 minutes.

How does Python determine idle time?

Call get_idle_duration() to get idle time in seconds. Another library could set argtypes , restype , or errcheck on windll. user32. GetLastInputInfo in an incompatible way, so you should use your own WinDLL instance, e.g. user32 = WinDLL('user32', use_last_error=True) .


1 Answers

Here is pure JavaScript way to track the idle time and when it reach certain limit do some action:

var IDLE_TIMEOUT = 60; //seconds  var _idleSecondsTimer = null;  var _idleSecondsCounter = 0;    document.onclick = function() {      _idleSecondsCounter = 0;  };    document.onmousemove = function() {      _idleSecondsCounter = 0;  };    document.onkeypress = function() {      _idleSecondsCounter = 0;  };    _idleSecondsTimer = window.setInterval(CheckIdleTime, 1000);    function CheckIdleTime() {       _idleSecondsCounter++;       var oPanel = document.getElementById("SecondsUntilExpire");       if (oPanel)           oPanel.innerHTML = (IDLE_TIMEOUT - _idleSecondsCounter) + "";      if (_idleSecondsCounter >= IDLE_TIMEOUT) {          window.clearInterval(_idleSecondsTimer);          alert("Time expired!");          document.location.href = "logout.html";      }  }
#SecondsUntilExpire { background-color: yellow; }
You will be auto logged out in <span id="SecondsUntilExpire"></span> seconds.

​This code will wait 60 seconds before showing alert and redirecting, and any action will "reset" the count - mouse click, mouse move or key press.

It should be as cross browser as possible, and straight forward. It also support showing the remaining time, if you add element to your page with ID of SecondsUntilExpire.

The above code should work fine, however has several downsides, e.g. it does not allow any other events to run and does not support multiply tabs. Refactored code that include both of these is following: (no need to change HTML)

var IDLE_TIMEOUT = 60; //seconds var _localStorageKey = 'global_countdown_last_reset_timestamp'; var _idleSecondsTimer = null; var _lastResetTimeStamp = (new Date()).getTime(); var _localStorage = null;  AttachEvent(document, 'click', ResetTime); AttachEvent(document, 'mousemove', ResetTime); AttachEvent(document, 'keypress', ResetTime); AttachEvent(window, 'load', ResetTime);  try {     _localStorage = window.localStorage; } catch (ex) { }  _idleSecondsTimer = window.setInterval(CheckIdleTime, 1000);  function GetLastResetTimeStamp() {     var lastResetTimeStamp = 0;     if (_localStorage) {         lastResetTimeStamp = parseInt(_localStorage[_localStorageKey], 10);         if (isNaN(lastResetTimeStamp) || lastResetTimeStamp < 0)             lastResetTimeStamp = (new Date()).getTime();     } else {         lastResetTimeStamp = _lastResetTimeStamp;     }      return lastResetTimeStamp; }  function SetLastResetTimeStamp(timeStamp) {     if (_localStorage) {         _localStorage[_localStorageKey] = timeStamp;     } else {         _lastResetTimeStamp = timeStamp;     } }  function ResetTime() {     SetLastResetTimeStamp((new Date()).getTime()); }  function AttachEvent(element, eventName, eventHandler) {     if (element.addEventListener) {         element.addEventListener(eventName, eventHandler, false);         return true;     } else if (element.attachEvent) {         element.attachEvent('on' + eventName, eventHandler);         return true;     } else {         //nothing to do, browser too old or non standard anyway         return false;     } }  function WriteProgress(msg) {     var oPanel = document.getElementById("SecondsUntilExpire");     if (oPanel)          oPanel.innerHTML = msg;     else if (console)         console.log(msg); }  function CheckIdleTime() {     var currentTimeStamp = (new Date()).getTime();     var lastResetTimeStamp = GetLastResetTimeStamp();     var secondsDiff = Math.floor((currentTimeStamp - lastResetTimeStamp) / 1000);     if (secondsDiff <= 0) {         ResetTime();         secondsDiff = 0;     }     WriteProgress((IDLE_TIMEOUT - secondsDiff) + "");     if (secondsDiff >= IDLE_TIMEOUT) {         window.clearInterval(_idleSecondsTimer);         ResetTime();         alert("Time expired!");         document.location.href = "logout.html";     } } 

The refactored code above is using local storage to keep track of when the counter was last reset, and also reset it on each new tab that is opened which contains the code, then the counter will be the same for all tabs, and resetting in one will result in reset of all tabs. Since Stack Snippets do not allow local storage, it's pointless to host it there so I've made a fiddle: http://jsfiddle.net/yahavbr/gpvqa0fj/3/

like image 122
Shadow Wizard Hates Omicron Avatar answered Sep 22 '22 18:09

Shadow Wizard Hates Omicron