2015-04-12 71 views
1

我可以做一些事情,如每30秒之后重新加载页面,并且后端逻辑将决定哪个会话已经失效:setTimeout函数,如果用户不活跃

setInterval(function() { 
    location.reload() 
}, 30000); 

但是,怎么会只有我如果用户不活跃,请运行这30秒location.reload()?例如,如果用户在页面上未处于活动状态(仅在用户处于“非活动状态”之后才开始计数),银行将如何产生用户超时。这将如何完成?

+1

http://stackoverflow.com/questions/13246378/detecting-user-inactivity-over-a-browser-purely-through-javascript –

+1

'? –

回答

3

一种方法是跟踪鼠标移动。如果用户已经采取重点远离网页,或失去了兴趣,通常会有任何鼠标活动:

(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); 
}()); 
+0

是不是这个方法相当“沉重”,因为当用户使用该页面时,这将不停地发射? – David542

+1

@ David542-那么如何在不跟踪用户活动的情况下跟踪用户活动?可以使用其他一些事件,但这个开销很小。 – RobG

+0

包装所有的好方法:-)将保持命名空间清晰。 –

0

为了解决这个问题,使用窗口模糊重点,如果这个人是不是在那里持续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); 

DEMO:http://jsfiddle.net/rpawdg6w/2/

+0

OP中没有库标签或使用。你还没有指出你正在使用的是什么。我得到* {“error”:“请使用POST请求”} *。无论30秒是否已过,它似乎也会在每个模糊/焦点对上运行。 – RobG

+0

如果焦点停留在应用程序上,但用户有电话并走开,会发生什么?所以模糊不会发生? –

0

您可以查看用户会话的背景,例如发送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();

2

首先定义什么是 “积极” 的意思。 “主动”可能意味着发送鼠标点击和按键。

然后,设计自己的处理器针对这些情况,是这样的:

// 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()到那里的代码。

+0

*首先定义“积极”意味着什么。*好的开始,应该说我自己。 ;-) – RobG