我可以做一些事情,如每30秒之后重新加载页面,并且后端逻辑将决定哪个会话已经失效:setTimeout函数,如果用户不活跃
setInterval(function() {
location.reload()
}, 30000);
但是,怎么会只有我如果用户不活跃,请运行这30秒location.reload()
?例如,如果用户在页面上未处于活动状态(仅在用户处于“非活动状态”之后才开始计数),银行将如何产生用户超时。这将如何完成?
我可以做一些事情,如每30秒之后重新加载页面,并且后端逻辑将决定哪个会话已经失效:setTimeout函数,如果用户不活跃
setInterval(function() {
location.reload()
}, 30000);
但是,怎么会只有我如果用户不活跃,请运行这30秒location.reload()
?例如,如果用户在页面上未处于活动状态(仅在用户处于“非活动状态”之后才开始计数),银行将如何产生用户超时。这将如何完成?
一种方法是跟踪鼠标移动。如果用户已经采取重点远离网页,或失去了兴趣,通常会有任何鼠标活动:
(function() {
var lastMove = Date.now();
document.onmousemove = function() {
lastMove = Date.now();
}
setInterval(function() {
var diff = Date.now() - lastMove;
if (diff > 1000) {
console.log('Inactive for ' + diff + ' ms');
}
}, 1000);
}());
为了解决这个问题,使用窗口模糊和重点,如果这个人是不是在那里持续30秒,它将进入else状态,否则它将重新加载页面。
setTimeout(function(){
$(window).on("blur focus", function(e) {
var prevType = $(this).data("prevType");
if (prevType != e.type) { // reduce double fire issues
switch (e.type) {
case "blur":
$('div').text("user is not active on page ");
break;
case "focus":
location.reload()
break;
}
}
$(this).data("prevType", e.type);
})},30000);
OP中没有库标签或使用。你还没有指出你正在使用的是什么。我得到* {“error”:“请使用POST请求”} *。无论30秒是否已过,它似乎也会在每个模糊/焦点对上运行。 – RobG
如果焦点停留在应用程序上,但用户有电话并走开,会发生什么?所以模糊不会发生? –
您可以查看用户会话的背景,例如发送AJAX调用每隔30 - 60秒。如果AJAX的响应不足(例如会话过期),那么您可以重新加载页面。
var timer;
function checkSession() {
$.ajax({
url : 'checksession.php',
success: function(response) {
if (response == false) {
location.reload();
}
}
});
clearTimeout(timer);
timer = setTimeout(checkSession,30 * 1000);
}
checkSession();
首先定义什么是 “积极” 的意思。 “主动”可能意味着发送鼠标点击和按键。
然后,设计自己的处理器针对这些情况,是这样的:
// Reseting the reload timer
MyActivityWatchdog.prototype.resetReloadTimer = function(event) {
var reloadTimeInterval = 30000;
var timerId = null;
...
if (timerId) {
window.clearInterval(timerId);
}
timerId = window.setInterval(reload... , reloadTimeInterval);
...
};
然后,确保必要的事件处理程序将调用resetReloadTimer()
。为此,你必须看看你的软件已经做了什么。有关键的新闻处理程序吗?有鼠标移动处理程序吗?不知道你的代码,注册按键或鼠标移动的文件或窗口,可能是一个良好的开端:
window.onmousemove = function() {
...
activityWatchdog.resetReloadTimer();
...
};
但是这个样子,准备像按钮等子元素不会触发事件,并且有已经是不同的事件处理程序。妥协将找到一系列注册处理程序,确保“活动”将被识别。例如。如果您的应用程序中有一个大型的富文本编辑器,则仅在此处注册就足够了。所以,也许你可以添加电话resetReloadTimer()
到那里的代码。
*首先定义“积极”意味着什么。*好的开始,应该说我自己。 ;-) – RobG
http://stackoverflow.com/questions/13246378/detecting-user-inactivity-over-a-browser-purely-through-javascript –
'? –