0

我想通过收听类似的事件 click, mousedown, mousemove, keydown, keypress, touchcancel, touchmove, focus, zoom, scroll和更多类似的事件来检查用户是否在页面上仍然处于活动状态。

我想每隔 3 分钟检查一次,并在用户仍处于活动状态时运行一个函数。有活动时,需要每 3 分钟执行一次功能。

如果没有活动,则无需采取任何行动。

目前我有什么:

var app = angular.module('Application_TimeOut', []);

app.run(function($rootScope, $timeout, $document) {    
    console.log('starting run');

    var executeOnceTimeout;

    // Timeout timer value
    var TimeOutTimerValue = 180000;

    // Start a timeout
    var TimeOut_Thread = $timeout(function(){ LogoutByTimer() } , TimeOutTimerValue);
    var bodyElement = angular.element($document);
    
    angular.forEach(['keydown', 'keyup', 'click', 'mousemove', 'DOMMouseScroll', 'mousewheel', 'mousedown', 'touchstart', 'touchmove', 'scroll', 'focus'], 
    function(EventName) {
         bodyElement.bind(EventName, function (e) { TimeOut_Resetter(e) });  
    });

    function LogoutByTimer(){
        console.log('No action needed');
    }

    function TimeOut_Resetter(e){
        console.log(' ' + e);

        if (!executeOnceTimeout) {
            executeOnceTimeout = $timeout(function() {
                console.log('call this function once each time');
                executeOnceTimeout = null;
            }, 2000);
        }

        /// Stop the pending timeout
        $timeout.cancel(TimeOut_Thread);

        /// Reset the timeout
        TimeOut_Thread = $timeout(function(){ LogoutByTimer() } , TimeOutTimerValue);
    }

})

在 plunker 上看到它

但这并没有按预期工作,因为它在执行函数后一直在查看交互,而这只会在 3 分钟后再次发生。看起来超时并没有停止。

试图改变$timeout$interval但没有帮助。

如何才能在 3 分钟后运行对用户活动的检查,并且当有活动时,该功能Timeout_Resettter将运行一次。之后,必须重置 3 分钟的计时器,并且必须每 3 分钟重复一次,当没有用户活动时,无需采取任何行动。

4

1 回答 1

1
  1. 创建服务并在服务中设置当前时间。
  2. 在每个活动中通过传递当前时间来调用服务。
  3. 如果时间设置大于或等于较早时间设置的 3 分钟,则检查服务。如果是,则根据您的要求发出一个事件并处理该事件。
于 2021-03-24T15:03:42.007 回答