如果用户当前在页面上处于活动状态,我如何使用JavaScript/jQuery进行检测?

Dar*_*ein 34 javascript jquery

我需要在当前页面上检测用户何时处于非活动状态(不是单击或键入)超过30分钟.

我认为最好使用贴在身体标签上的事件blubbling,然后继续重置计时器30分钟,但我不确定如何创建它.

我有jQuery可用,虽然我不确定这有多少实际上会使用jQuery.

编辑:我更需要知道他们是否正在积极使用该网站,因此点击(更改字段或字段中的位置或选择复选框/无线电)或键入(在输入,textarea等).如果他们在另一个选项卡中或使用其他程序,那么我的假设是他们没有使用该网站,因此应该注销(出于安全原因).

编辑#2:所以每个人都清楚,这根本不是用于确定用户是否已登录,经过身份验证或其他任何内容.现在,如果用户在30分钟内没有发出页面请求,服务器会将用户注销.此功能可防止有人花费> 30分钟填写表单然后提交表单以发现他们尚未注销的时间.因此,这将与服务器站点结合使用,以确定用户是否处于非活动状态(不是单击或键入).基本上,交易是在闲置25分钟后,他们将看到一个对话框输入他们的密码.如果他们不在5分钟内,系统会自动将其注销,并且服务器的会话将被注销(下次访问页面时,与大多数站点一样).

Javascript仅用作对用户的警告.如果JavaScript被禁用,那么他们将不会收到警告(并且大部分网站都不工作),他们将在下次请求新页面时注销.

Dar*_*ein 27

这就是我想出来的.它似乎适用于大多数浏览器,但我想确保它始终可以在任何地方使用:

var timeoutTime = 1800000;
var timeoutTimer = setTimeout(ShowTimeOutWarning, timeoutTime);
$(document).ready(function() {
    $('body').bind('mousedown keydown', function(event) {
        clearTimeout(timeoutTimer);
        timeoutTimer = setTimeout(ShowTimeOutWarning, timeoutTime);
    });
});
Run Code Online (Sandbox Code Playgroud)

有谁看到任何问题?

  • 要添加到 Glade 的评论中,我还使用鼠标移动,ala:`$('body').bind('mousemove mousedown keydown touchstart', function(event) {....` (4认同)
  • 一个小问题 - 你需要在开始另一个之前清除现有的计时器!我在......中编辑了这个变化 (3认同)
  • 不,变量只是一个计时器ID,计时器本身就是一个内部浏览器结构.将ID存储在变量中只是识别clearTimeout函数的内部浏览器结构的一种简单方法. (3认同)
  • 只有一个补充,我添加了"touchstart"事件,以便在支持触摸的设备上更好地工作.ie $('body').bind('mousedown keydown touchstart',function(event){.... (2认同)

Mal*_*ist 17

您可以观看鼠标移动,但这是关于用户仍然在那里而不是听取点击事件的最佳情况.但javascript无法判断它是活动标签还是浏览器甚至是打开的.(好吧,你可以得到浏览器的宽度和高度,并告诉你它是否被最小化)

  • 你的意思是没有keyup事件?当用户停止输入时,这是最后一个keyup事件,并且通过键盘功能事件无法进行检查,看看该keyup事件发生多久以前 (3认同)
  • @Malfist - 正是我的意思,检查两者,而不仅仅是一个.这就是为什么我说"也看看关键事件" (3认同)
  • @TStamper:同意。想象一下,花半小时在“投诉”框中键入一个长字母,却使该网站注销,就像您将最后的繁荣放在长达一段段落的关闭侮辱上一样。真是气死我了 (2认同)

yal*_*tar 16

我刚刚做了类似的事情,虽然使用Prototype而不是JQuery,但我想只要JQuery支持自定义事件,实现就会大致相同.

简而言之,IdleMonitor是一个观察鼠标和键盘事件的类(根据您的需要进行相应调整).每30秒重置计时器并广播一个状态:idle事件,除非它获得鼠标/键事件,在这种情况下它会广播一个状态:active事件.

var IdleMonitor = Class.create({

    debug: false,
    idleInterval: 30000, // idle interval, in milliseconds
    active: null,
    initialize: function() {
        document.observe("mousemove", this.sendActiveSignal.bind(this));
        document.observe("keypress", this.sendActiveSignal.bind(this));
        this.timer = setTimeout(this.sendIdleSignal.bind(this), this.idleInterval);
    },

    // use this to override the default idleInterval
    useInterval: function(ii) {
        this.idleInterval = ii;
        clearTimeout(this.timer);
        this.timer = setTimeout(this.sendIdleSignal.bind(this), ii);
    },

    sendIdleSignal: function(args) {
        // console.log("state:idle");
        document.fire('state:idle');
        this.active = false;
        clearTimeout(this.timer);
    },

    sendActiveSignal: function() {
        if(!this.active){
            // console.log("state:active");
            document.fire('state:active');
            this.active = true;
            this.timer = setTimeout(this.sendIdleSignal.bind(this), this.idleInterval);
        }
    }
});
Run Code Online (Sandbox Code Playgroud)

然后我刚刚创建了另一个在其中包含以下内容的类:

Event.observe(document, 'state:idle', your-on-idle-functionality);
Event.observe(document, 'state:active', your-on-active-functionality)
Run Code Online (Sandbox Code Playgroud)


小智 15

Ifvisible.js是一个交叉浏览器轻量级解决方案.它可以检测用户何时切换到另一个选项卡并返回当前选项卡.它还可以检测用户何时进入空闲状态并再次变为活动状态.它非常灵活.


Jer*_*ony 5

Ifvisible是一个不错的JS库,用于检查用户的非活动状态。

ifvisible.setIdleDuration(120); // Page will become idle after 120 seconds

ifvisible.on("idle", function(){
   // do something
});
Run Code Online (Sandbox Code Playgroud)