需要您的宝贵意见。我已经实现了idletimeout功能,以便在用户空闲时会话将在3分钟后到期。
在三种情况下,我正在重置计时器。
问题是有时候会话在3分钟之前就会超时,即使我点击,点击或滚动也会将用户重定向到登录页面,即使该功能在点按或滚动时被调用,重置用户也会被调用。我正面临着找出漏洞的困难时期。
我发布的代码;如果你发现任何事情,请告诉我。
// Set timeout variables.
var timoutNow = 180000 ;
var ua = navigator.userAgent;
var event = ((ua.match(/iPad/i)) || (ua.match(/iPhone/i)) || (ua.match(/iPod/i))) ? 'touchstart' : 'click';
var logoutUrl = Mobile+'/login.html'; // URL to logout page.
var timeoutTimer;
// Start timers.
function StartTimers() {
timeoutTimer = setTimeout("IdleTimeout()", timoutNow);
//console.log(timoutNow);
}
// Reset timers.
function ResetTimers() {
clearTimeout(timeoutTimer);
StartTimers();
}
// Processing time check.
function Laodtimercheck()
{
setInterval(function(){
if($("body").hasClass("loading-processing")==true)
{
ResetTimers();
}
}, 2000);
}
// Logout the user.
function IdleTimeout() {
sessionStorage.clear();
document.location.href = Mobile+'/login.html';
}
$(document).live(event, function(){
//console.log("Reset timers: ON TAP OR CLICK");
ResetTimers();
});
$(document).mouseover(function() {
//console.log("Reset timers: ONMOUSEOVER");
ResetTimers();
});
$(window).scroll(function() {
//console.log("Reset timers: SCROLL");
ResetTimers();
});
$(document).live("scrollstart", function(){
//console.log("Reset timers: SCROLLSTART");
ResetTimers();
});
编辑:setTimeout只能工作两次;下次ResetTimers被调用但是setTimeout没有工作,或者我可能会在这里丢失一些东西,因为会话按照以前的两个调用时间超时....
答案 0 :(得分:1)
你遇到的真正问题是:“ResetTimers”没有足够的调用。 为什么不被充分调用?我会尽力回答。
所有逻辑都没问题,只有少数例外。有两个“有问题”的事件不起作用,或者我认为不能像你想要的那样工作。
该事件永远不会被解雇。您无法将实时事件附加到文档,您需要指定节点,如html或body。
$("body").live(event, function(){
//console.log("Reset timers: ON TAP OR CLICK");
ResetTimers();
});
这就是为什么单击时计时器不会重置。
将变量用于绑定事件的另一种(并推荐)方法是使用.delegate()
。
由于jQuery 1.4.3+
是推荐的做法。
$(document).delegate("body", event, function(){
//console.log("Reset timers: ON TAP OR CLICK (delegate)");
ResetTimers();
});
其中任何一个(在身体上或代表身上)都会工作,计时器会在点击或点按事件时重置。
本次活动本身没有问题,但我认为这是不足够的。 MouseOver仅在指针第一次进入屏幕的位置触发,如果鼠标不离开窗口,鼠标悬停再也不会触发。也许,更好或添加控制“鼠标悬停”在文档上的方法是使用onmousemove事件。就像我之前在评论中所说的那样,我不知道你是否要对此严格要求,所以我给你一个提案,让我们看看它是否符合你的需求。
$(document).mouseover(function() {
console.log("Reset timers: ONMOUSEOVER");
ResetTimers();
});
在我的测试中,事件会引发很多事情,并且计时器会在每个事件上重置而不会出现问题。我希望它可以帮助你。