javascript 上的 localStorage 导致刷新
localStorage on javascript leads refreshing
我试图在空闲时解雇用户,跨选项卡使用 javascript,下面的代码对于单个选项卡工作正常,对于多个选项卡它不能正常工作
例如:我将 10 秒设置为空闲时间,并在 10 秒后离开第一个选项卡,它会抛出用户,假设我在 00:00:05[=21 打开了第一个选项卡=] 小时并在 00:00:10 小时打开第二个选项卡并在第二个选项卡上工作 00:00:13 小时并离开两个选项卡项目必须注销 00:00:23 对吗?但是它在 00:00:15 上注销了,我不知道这里发生了什么,如果它没有正确刷新它怎么会在我的时候长时间停留在第二个选项卡上在用吗?如果刷新正常怎么会根据第一个打开的标签注销我,代码如下
<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>
对于您的应用程序(选项卡)的每个实例,此行每秒 运行。这意味着如果您打开了 2 个选项卡,那么它每秒递增 2,而不是 1。
localStorage.setItem("setTimeOut", parseInt(localStorage.getItem("setTimeOut"))+1);
您可以通过使用用户注销的特定时间而不是倒计时来解决此问题。
与其在每个选项卡上每秒递增该值,这意味着每秒它会随着打开的选项卡数量而不是 1 秒而增加,只需设置当前交互时间,然后每秒与该值进行比较。
因此,在您的事件处理程序中,改为这样做:
localStorage.setItem("lastInteraction", Date.now())
... 然后在您的 CheckIdleTime()
函数中,删除 localStorage.setItem()
并将您的 if
条件更改为:
Number(localStorage.getItem("lastInteraction")) + (IDLE_TIMEOUT * 1000) < Date.now()
该条件采用上次交互发生的时间,添加超时常量,然后检查当前时间(现在)是否已超过该值。
我试图在空闲时解雇用户,跨选项卡使用 javascript,下面的代码对于单个选项卡工作正常,对于多个选项卡它不能正常工作
例如:我将 10 秒设置为空闲时间,并在 10 秒后离开第一个选项卡,它会抛出用户,假设我在 00:00:05[=21 打开了第一个选项卡=] 小时并在 00:00:10 小时打开第二个选项卡并在第二个选项卡上工作 00:00:13 小时并离开两个选项卡项目必须注销 00:00:23 对吗?但是它在 00:00:15 上注销了,我不知道这里发生了什么,如果它没有正确刷新它怎么会在我的时候长时间停留在第二个选项卡上在用吗?如果刷新正常怎么会根据第一个打开的标签注销我,代码如下
<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>
对于您的应用程序(选项卡)的每个实例,此行每秒 运行。这意味着如果您打开了 2 个选项卡,那么它每秒递增 2,而不是 1。
localStorage.setItem("setTimeOut", parseInt(localStorage.getItem("setTimeOut"))+1);
您可以通过使用用户注销的特定时间而不是倒计时来解决此问题。
与其在每个选项卡上每秒递增该值,这意味着每秒它会随着打开的选项卡数量而不是 1 秒而增加,只需设置当前交互时间,然后每秒与该值进行比较。
因此,在您的事件处理程序中,改为这样做:
localStorage.setItem("lastInteraction", Date.now())
... 然后在您的 CheckIdleTime()
函数中,删除 localStorage.setItem()
并将您的 if
条件更改为:
Number(localStorage.getItem("lastInteraction")) + (IDLE_TIMEOUT * 1000) < Date.now()
该条件采用上次交互发生的时间,添加超时常量,然后检查当前时间(现在)是否已超过该值。