Javascript 会话超时有问题

Javascript 会话超时有问题,javascript,jquery,session-timeout,Javascript,Jquery,Session Timeout,我需要你对此的宝贵反馈。我已经实现了idletimeout功能,因此如果用户空闲,会话将在3分钟后过期 在三个场景中,我正在重置计时器 单击或轻触 处理过程中2秒后 滚动或滚动开始 问题是,有时会话在3分钟之前超时,即使我点击、单击或滚动,并且用户被重定向到登录页面,即使在点击、单击或滚动时调用了该功能,并且调用了resettimers。我正面临着找出漏洞的困难时期 我张贴代码;如果你注意到什么,请告诉我 // Set timeout variables. var timoutNow =

我需要你对此的宝贵反馈。我已经实现了idletimeout功能,因此如果用户空闲,会话将在3分钟后过期

在三个场景中,我正在重置计时器

  • 单击或轻触
  • 处理过程中2秒后
  • 滚动或滚动开始
  • 问题是,有时会话在3分钟之前超时,即使我点击、单击或滚动,并且用户被重定向到登录页面,即使在点击、单击或滚动时调用了该功能,并且调用了resettimers。我正面临着找出漏洞的困难时期

    我张贴代码;如果你注意到什么,请告诉我

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

    编辑:设置超时仅工作前两次;下次调用ResetTimer时,setTimeout不起作用,或者由于会话仅按照前两次调用时间超时,我可能会在这里遗漏一些内容……

    您遇到的真正问题是:调用的“ResetTimer”不够。 为什么调用不够?我会尽力回答的

    除了少数例外,所有逻辑都正常。有两个“有问题”的事件不起作用,或者我认为不起作用

    1.-现场(活动) 该事件不会被触发,永远不会。您不能将实时事件附加到文档,您需要指定一个节点,如html或body

    $("body").live(event, function(){
            //console.log("Reset timers: ON TAP OR CLICK");
            ResetTimers();
    });
    
    这就是为什么当点击计时器时不会重置。 为绑定事件使用变量的另一种(也是推荐的)方法是使用
    .delegate()
    。 因为
    jquery1.4.3+
    是推荐的方法

    $(document).delegate("body", event, function(){
            //console.log("Reset timers: ON TAP OR CLICK (delegate)");
            ResetTimers();
    });
    
    其中任何一个(在主体或代理上直播)都可以工作,并且在单击或点击事件时计时器会被重置

    2.-鼠标悬停 这件事本身并没有问题,但我认为这是不够的。鼠标盖仅在指针第一次出现在屏幕上的地方触发,如果鼠标不离开窗口,鼠标盖将不会再次触发。也许,在文档上控制“鼠标悬停”的更好或添加的方法是使用onmousemove事件。就像我之前在评论中说的,我不知道你是否想在这方面严格要求,所以我给你留下了一个建议,让我们看看它是否符合你的需要

    $(document).mouseover(function() {
            console.log("Reset timers: ONMOUSEOVER");
            ResetTimers();
    
    });
    

    在我的测试中,事件会被触发很多次,并且计时器会在每个事件上重置,不会出现问题。我希望它能帮助您。

    您使用的是什么版本的
    jQuery
    .live()
    已经被弃用了一段时间(从v1.7开始):只需一个headup
    $(“body”).hasClass(“加载处理”)==true
    就可以是
    $(“body”).hasClass(“加载处理”)
    它返回布尔值。您可以尝试更改这一行
    timeoutTimer=setTimeout(“IdleTimeout()”,timoutNow)用这个
    timeoutTimer=setTimeout(函数(){IdleTimeout()},timoutNow)顺便说一句,此函数在您的代码中从未调用过。@frikinside尝试过此方法,但无效。会话在最后一个setTimeout值之前超时。@frikinside Laodtimercheck()在处理任何请求时在另一个js中被调用。