0

我一直在尝试创建一个计时器,当他们成为偶像超过 10 分钟时,它将让我的客户退出。我已经创建了下面的代码,只要用户不打开第二个选项卡,它就可以正常工作。我有许多客户打开第二个窗口或选项卡,当第二个选项卡打开时,计数器加速。我正在寻找一种改进以下代码的方法,以便选项卡/窗口可以更好地同步。

var cookies='off'; // var to check if cookies are turned off
var alertTimes=0; // alturnative to cookies
$(function(){
    resetCookies();
    var loginTime=getCookie("loginTime");
    if (loginTime!=null && loginTime!=""){ cookies='on'; }
    checkAlerts();
});

function resetCookies(){
    setCookie("loginTime",'10',1);
    alertTimes=0;
}
function checkTime() {
    if(cookies=='on'){
        var loginTime=getCookie("loginTime");
        if (loginTime!=null && loginTime!=""){ 
            var newTime=loginTime-1;
            if(newTime==0){ autoLogout(); return false;}
            setCookie("loginTime",newTime,1);
        }else{ autoLogout(); return false;}
    }else{
        alertTimes++;
        if(alertTimes>=10){ autoLogout(); return false;}
    }
    setTimeout(checkTime, 600000);
}
function setCookie(c_name,value,exdays){
    var exdate=new Date();
    exdate.setDate(exdate.getDate() + exdays);
    var c_value=escape(value) + ((exdays==null) ? "" : "; expires="+exdate.toUTCString());
    document.cookie=c_name + "=" + c_value;
}
function getCookie(c_name){
  var i,x,y,ARRcookies=document.cookie.split(";");
  for (i=0;i<ARRcookies.length;i++){
    x=ARRcookies[i].substr(0,ARRcookies[i].indexOf("="));
    y=ARRcookies[i].substr(ARRcookies[i].indexOf("=")+1);
    x=x.replace(/^\s+|\s+$/g,"");
    if (x==c_name){ return unescape(y); }
  }
}
function autoLogout(){
    window.location.href=("logout.php");
}
4

2 回答 2

1

也许这个例子会满足你的需求?

( function ( $ ) {
  $.loginTimeout = function ( options ) {

    var opts = $.extend( {}, $.loginTimeout.defaults, options ),
    callback = function() {
      $.getJSON( opts.url, function ( data ) {
        if(data.status === "signed_out")
        document.location = opts.redirectTo;
      });
    };
    setInterval( callback, opts.timeout * 1000 );
  };

  $.loginTimeout.defaults = {
    timeout: 60,
    redirectTo: "/login",
    url: "/check_login"
  };
} ( jQuery ) );
// ...
$.loginTimeout({
  redirectTo: "/users/sign_in",
  url: "/users/check_status"
});

还请记住,在此示例中,服务器应用程序正在确定用户会话是否已过期

于 2013-02-18T15:22:24.120 回答
0

您提供的代码几乎就在那里。我的代码需要同样的东西。我在 cookie 中添加了信息(上次修改)并将其与当前时间进行比较。如果两者之间有足够的空间(在本例中为 1 秒),则修改 cookie 信息。即使您打开了 15 个选项卡,这也有效。
我检查了他们是否打开了cookies。

$(function(){
    resetCookies();
    setTimeout(checkTime, 1000);
});

function resetCookies(){
    setCookie("loginTime",'10',1);
}
function checkTime() {

    var arrloginTime=getCookie("loginTime").split("--");
    var loginTime=arrloginTime[0];
    var dtmLastMod=new Date(arrloginTime[1]);
    console.log(loginTime);
    if (loginTime!=null && loginTime!=""){ 
        var dtmNow = new Date();
        if ((dtmNow.getTime() - dtmLastMod.getTime()) >= 1000){
            var newTime=loginTime-1;
            if(newTime==0){ autoLogout(); return false;}
            setCookie("loginTime",newTime,1);
        }
    }else{ autoLogout(); return false;}
    setTimeout(checkTime, 1000);
}
function setCookie(c_name,value,exdays){
    var exdate=new Date();
    var dtmLastMod = new Date();
    exdate.setDate(exdate.getDate() + exdays);
    var c_value=escape(value) + "--" + dtmLastMod + ((exdays==null) ? "" : "; expires="+exdate.toUTCString());
    document.cookie=c_name + "=" + c_value;
}
function getCookie(c_name){
  var i,x,y,ARRcookies=document.cookie.split(";");
  for (i=0;i<ARRcookies.length;i++){
    x=ARRcookies[i].substr(0,ARRcookies[i].indexOf("="));
    y=ARRcookies[i].substr(ARRcookies[i].indexOf("=")+1);
    x=x.replace(/^\s+|\s+$/g,"");
    if (x==c_name){ return unescape(y); }
  }
}
function autoLogout(){
    console.log('You have been logged out of this document due to inactivity.');
}
于 2013-08-21T18:45:35.440 回答