通过浏览器检测用户不活动 - 纯粹通过 javascript [重复]
Posted
技术标签:
【中文标题】通过浏览器检测用户不活动 - 纯粹通过 javascript [重复]【英文标题】:Detecting user inactivity over a browser - purely through javascript [duplicate] 【发布时间】:2012-10-26 03:08:56 【问题描述】:在构建监视器时,它将监视用户在浏览器上的任何活动,例如单击按钮或在文本框上打字(而不是将鼠标悬停在文档上)。所以如果用户长时间没有活动,会话就会超时。
我们需要在没有 jQuery 或类似的东西的情况下做到这一点。我可能会使用ajax。另一端的 Java servlet 更可取。
【问题讨论】:
您是否在发出 Ajax 请求,或者是什么阻止了会话自行超时? 会话超时间隔将在 web.xml 中(在 java 应用程序中)。我们可以进行ajax调用(我不知道出于什么目的,很可能是为了使会话无效)。如果用户空闲的时间超过了 web.xml 中提到的时间间隔,我们会提醒你超时的消息,宝贝! 以下选择的答案取自这个***答案***.com/questions/9564602/…。 我更喜欢这个问题,因为它没有提到 IE。 【参考方案1】:Here is pure javascript way跟踪空闲时间,当达到一定的限制时做一些动作,你可以相应地修改并使用
var IDLE_TIMEOUT = 60; //seconds
var _idleSecondsCounter = 0;
document.onclick = function()
_idleSecondsCounter = 0;
;
document.onmousemove = function()
_idleSecondsCounter = 0;
;
document.onkeypress = function()
_idleSecondsCounter = 0;
;
window.setInterval(CheckIdleTime, 1000);
function CheckIdleTime()
_idleSecondsCounter++;
var oPanel = document.getElementById("SecondsUntilExpire");
if (oPanel)
oPanel.innerhtml = (IDLE_TIMEOUT - _idleSecondsCounter) + "";
if (_idleSecondsCounter >= IDLE_TIMEOUT)
alert("Time expired!");
document.location.href = "logout.html";
此代码将在显示警报和重定向之前等待 60 秒,并且任何操作都将“重置”计数 - 鼠标单击、鼠标移动或按键。
它应该尽可能跨浏览器,并且直截了当。如果您向页面添加 ID 为 SecondsUntilExpire 的元素,它还支持显示剩余时间。
参考:How to know browser idle time?
【讨论】:
为什么不直接使用monitorEvents(window);
?
setInterval 对我来说很不稳定,这是为什么呢?
网址无效。结帐jsfiddle.net/mManishTrivedi/cbq1hmtg【参考方案2】:
您建议的方法的问题是会话将超时,即使用户正在移动鼠标或输入输入。因此,如果您将会话超时设置为 20 分钟,并且用户持续输入 21 分钟,则会话仍然会超时,即使他们已经“处于活动状态”。唯一可以防止会话超时的是对服务器的新请求。
解决方案一:让服务器控制会话超时
除非您在后台发出 Ajax 请求,否则会不断更新会话,您可以在页面加载时设置 JavaScript 超时,并以这种方式提醒用户。除非您向服务器发出其他请求,否则当用户在您的页面上时,没有必要让它变得困难:
setTimeout(function ()
alert("You've timed out baby!");
, 1200000); // 20 minutes in millisec (modify to your session timeout)
如果用户访问另一个页面或重新加载该页面,则会话会被更新并且 JavaScript 计时器会被重置。如果用户不这样做,会话将在用户收到警报的同时超时。
解决方案 2:让客户端控制会话超时
如果您希望 JavaScript 完全控制会话的持续时间,以便在用户键入、移动鼠标或其他任何内容时更新会话,您将不得不继续在后台向您的服务器,所以会话被更新。 (这可能是一个空的虚拟请求,只是命中服务器的东西)
然后,您必须跟踪您认为“用户活动”的所有操作(AnhSirk 在他的回答中提出了一种方法)并在发生此类事件时重置超时计时器。如果用户长时间处于非活动状态,您将不得不向服务器上的页面发出 Ajax 请求,这会使会话无效,然后您可以提醒用户会话已超时。
【讨论】:
以上是关于通过浏览器检测用户不活动 - 纯粹通过 javascript [重复]的主要内容,如果未能解决你的问题,请参考以下文章
通过Swift中的触摸检测应用程序何时处于活动状态或非活动状态[重复]