2017-07-10 4 views
2

Ich versuche, den Benutzer zu feuern, wenn Leerlauf für einzelne Register über Registerkarten, die folgenden Code funktioniert gut für mehrere Reiter JavaScript ist es nicht richtiglocalstorage auf Javascript führt erfrischend

Für ZB arbeiten: Ich gesetzt haben 10 Sekunden als Leerlaufzeit und verließ die erste Registerkarte es wirft den Benutzer auf 10 Sekunden, nehme an, ich öffnete die erste Registerkarte um 00:00:05 Stunden und öffnete zweite Registerkarte um 00:00:10 Stunden und arbeiten an zweite Registerkarte für 00:00:13 Stunden und links die beiden Registerkarten das Projekt abmelden müssen 00:00:23 richtig? aber es meldet sich an 00:00:15, ich weiß nicht, was hier passiert, wenn es nicht richtig auffrischen würde, wie könnte es auf der zweiten Registerkarte für eine lange Zeit bleiben, wenn ich es benutze? Wenn es korrekt aktualisiert wird, wie kann es mich abmelden, basierend auf der zuerst geöffneten Registerkarte und dem Code wie folgt.

<script> 
var IDLE_TIMEOUT = 10; //seconds 
localStorage.setItem("setTimeOut", "0"); 

document.onclick = function() {  
    localStorage.setItem("setTimeOut", "0"); 
}; 

document.onmousemove = function() { 
    localStorage.setItem("setTimeOut", "0"); 
}; 

document.onkeypress = function() { 
    localStorage.setItem("setTimeOut", "0"); 
}; 

document.onfocus = function() { 
    localStorage.setItem("setTimeOut", "0"); 
}; 


window.setInterval(CheckIdleTime, 1000); 
function CheckIdleTime() { 
    localStorage.setItem("setTimeOut", parseInt(localStorage.getItem("setTimeOut"))+1); 
    if (localStorage.getItem("setTimeOut") >= IDLE_TIMEOUT) { 
     alert('Times up!, You are idle for about 15 minutes, Please login to continue'); 
     document.location.href = "logout.php"; 
    } 
} 
</script> 
+0

hey hast du eine lösung? ... wenn ja bitte Funktionsscript hier posten ... da ich auch in Not gebraucht werde ... danke – user3209031

+0

Entschuldigung für die Verspätung, die untenstehende Lösung funktioniert bei mir, was ich als korrekt markiert habe. –

Antwort

1

Anstatt den Wert jede Sekunde auf jeder Registerkarte zu erhöhen, was bedeutet, dass jede Sekunde mit der Anzahl geöffneter Register statt 1 Sekunde erhöht wird, legen Sie einfach die aktuelle Zeit für die Interaktion fest und vergleichen Sie jede Sekunde mit dieser.

in Ihren Event-Handler Also, tun Sie stattdessen:

localStorage.setItem("lastInteraction", Date.now()) 

... und dann in Ihrer CheckIdleTime() Funktion, entfernen Sie die localStorage.setItem() und Ihren if Zustand, dies ändern:

Number(localStorage.getItem("lastInteraction")) + (IDLE_TIMEOUT * 1000) < Date.now() 

Die Bedingung nimmt die Zeit an, zu der die letzte Interaktion stattgefunden hat, addiert die Timeout-Konstante und prüft dann, ob die aktuelle Zeit (jetzt) ​​diesen Wert überschritten hat.

1

Diese Zeile wird jede Sekunde für jede Instanz Ihrer App (Registerkarte) ausgeführt. Das bedeutet, dass, wenn Sie zwei Registerkarten geöffnet haben, dann seine Inkrementierung von 2 jede Sekunde statt 1.

localStorage.setItem("setTimeOut", parseInt(localStorage.getItem("setTimeOut"))+1); 

Sie können dieses Problem beheben, indem Sie eine bestimmte Zeit zu verwenden, wenn der Benutzer werden protokolliert wird, sondern als ein Countdown.