【问题标题】:Clear localStorage on tab/browser close but not on refresh在选项卡/浏览器关闭但不刷新时清除 localStorage
【发布时间】:2016-12-31 22:05:56
【问题描述】:

有没有办法检测标签关闭事件来清除localStorage。我需要localStorage 跨标签共享数据。 window.onbeforeunload 事件工作正常,但对我来说有 2 个问题:

  1. 它还会在我不想要的页面刷新时触发。
  2. 标签关闭时不需要确认框。

就像关闭窗口时一样,sessionStorage 会被清除。同时我可以清除localStorage 但不知道要绑定什么事件。我检查了一些已经可用的问题,但似乎没有一个可以解决这个问题,有一些解决方法可以通过使用标志来点击链接和表单提交,但不是一种干净的方法。请为此提出任何解决方案。

【问题讨论】:

  • 他们说你真的做不到。 There are other ways of working around it. 重点是,这个问题已经被问过很多次了。查看这些问题,找出适合您情况的方法。
  • 然后阅读其他问题。
  • 那是因为您刚刚复制并粘贴了一些其他代码。如果用户提交表单或单击链接,则该代码会处理,而不是刷新页面。您需要真正了解您正在使用的代码。不要只是盲目地复制它。
  • 嗨,迈克。上面的代码供您参考,因为您说这是重复的。我知道没有处理刷新。这就是为什么我问了一个新问题!

标签: javascript html angularjs window


【解决方案1】:

我知道这是一个老问题,但我只是在寻找解决方案,但找不到任何可以正常工作的方法。然后我想出了一个适合我的解决方案。

我所做的是改变视角,而不是在浏览器关闭时清除本地存储,我决定在打开浏览器时清除它。用户不会看到差异。

我只是设置了一个在页面加载时检查 sessionStorage 的函数,如果它是空的,则该函数将 localStorage 清除;之后,它将register 设置为 sessionStorage 以确保不会因为重新加载页面而再次清空 localStorage。

function clearStorage() {

    let session = sessionStorage.getItem('register');

    if (session == null) {
    
        localStorage.removeItem('remove');

    }
    sessionStorage.setItem('register', 1);
}
window.addEventListener('load', clearStorage);

【讨论】:

  • 对于那些想要在整个浏览器会话关闭后清除本地存储(也就是关闭整个浏览器而不是选项卡)的人可以设置一个会话cookie来检查
【解决方案2】:

我能够找到解决方案并想到分享。 由于 window.onbeforeunload 事件在浏览器/选项卡关闭时触发,但也在刷新时触发(我不想要),所以我的本地存储也在 rfresh 时被处理。这是我不想要的。为了克服这个问题,我实现了另外 1 个事件处理程序 window.onload,它仅在刷新时触发,而不是在选项卡/浏览器关闭时触发,我将重置 localStorage,就好像什么都没发生一样。代码是:

window.onbeforeunload = function (e) {
    window.onunload = function () {
            window.localStorage.isMySessionActive = "false";
    }
    return undefined;
};

window.onload = function () {
            window.localStorage.isMySessionActive = "true";
};

我在 window.onbeforeunload 中返回了 undefined,因为我不希望在选项卡/浏览器关闭和刷新时出现确认弹出窗口。

【讨论】:

  • Vishal,尝试了同样的方法,当页面在 chrome 中刷新时也会调用 onunload 函数。它不能解决问题
  • @JayanthSuvarna 您似乎还没有阅读答案。它清楚地提到了这种行为是正常的以及如何解决它。
  • 如果不理解,请纠正我,window.onload 仅在刷新时触发,而不是在选项卡/浏览器关闭时触发,我的观察在这里 window.onunload 将首先被调用,然后调用'window.onload ' 在页面刷新期间,一旦我清除了事件 'window.onunload' 中的 localStorage,如何在 window.onload 中取回它?
  • 你设置回什么?您已经在 onunload 事件上清除了 localStorage,顺便说一下,这也清除了 isMySessionActive 变量。没有什么可以设置onload。您的解决方案可用于仅在刷新时而不是在关闭时清除 localStorage,换句话说,如果您的问题是相反的。 @JayanthSuvarna 在这一点上是完全正确的。
  • 这是他提供的完全错误的解决方案。这种方式是行不通的。
【解决方案3】:

检查 window.onbeforeunload 事件和 window.onload 事件之间的时间是否小于 3 秒保持会话有效,否则删除令牌。

window.onbeforeunload = function (e) {

window.localStorage.unloadTime = JSON.stringify(new Date());

};

window.onload = function () {

let loadTime = new Date();
let unloadTime = new Date(JSON.parse(window.localStorage.unloadTime));
let refreshTime = loadTime.getTime() - unloadTime.getTime();

if(refreshTime>3000)//3000 milliseconds
{
window.localStorage.removeItem("token");
}

};

【讨论】:

    【解决方案4】:

    使用cookie解决问题,cookie值会在浏览器关闭时自动删除, 就我而言,我使用的是带有令牌的 API,它存储在 localStorage 中,所以当浏览器关闭或关闭时,它不会注销用户,所以我所做的是

    登录后只需使用键“loginstatus”和值“loggedin”设置 cookie

    document.cookie = "loginstatus=loggedin";
    localStorage.setItem("token", token);
    

    在使用localStorage值检查用户是否登录的方法中

    isUserLoggedIn(){
       let session = localStorage.getItem('token');
       if (session == null) {
          return false;
       }else{
          return session
       }
    }   
    

    如果 cookie 值不存在,则通过删除 localStorage 令牌进行修改

    isUserLoggedIn(){
      // remove token if cookie not set
      if(this.getCookie("loginstatus") != 'loggedin'){
          localStorage.removeItem("token");
      }
    
      let session = localStorage.getItem('token');
      if (session == null) {
         return false;
      }else{
         return session
      }
    } 
    

    成功了!!!

    【讨论】:

    • 令牌过期了怎么办?
    • 在 API 标头中传递令牌并在中间件中验证令牌
    【解决方案5】:

    我知道这个问题已经很老了,但也许有人仍然需要它。

    这个解决方案并不漂亮,但效果很好:

      @HostListener('window:beforeunload')
      setToSession(): void {
        const token = this.authenticationService.currentTokenValue;
        sessionStorage.setItem('tempToken', JSON.stringify(token));
      }
    
      @HostListener('window:load')
      clearLocalStorage(): void {
        const session = sessionStorage.getItem('tempToken');
        const user = this.authenticationService.currentTokenValue.user;
        const loginMode = user.loginMode;
        console.log(loginMode);
        if (!loginMode && session == null) {
          console.log('TOKEN REMOVED');
          localStorage.removeItem('token');
          window.location.reload();
        }
      }

    关闭/重新加载时会在 sessionStorage 中存储一个临时令牌,重新加载时会查询该令牌。仅当令牌存在且 loginMode 为 false 时,才会删除存储。

    【讨论】:

      【解决方案6】:

      请改用SessionStorage。每当关闭选项卡时,它就会被清除。

      【讨论】:

      • 我需要 localStorage 来跨标签共享数据。
      • 它不会像预期的那样工作,因为它特定于选项卡
      猜你喜欢
      • 1970-01-01
      • 2016-09-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-14
      • 1970-01-01
      • 2022-01-06
      • 1970-01-01
      • 2018-03-27
      相关资源
      最近更新 更多