【问题标题】:JavaScript Differentiate Between Page Refresh, Browser Close and New tabJavaScript 区分页面刷新、浏览器关闭和新选项卡
【发布时间】:2021-12-17 16:54:46
【问题描述】:

我正在尝试区分页面刷新、浏览器关闭和新标签事件。

所以,我想在页面关闭 V/s 页面刷新/新标签时进行一些处理

我遇到了以下使用 sessionStorage 的解决方法。但是 sessionStorage 的问题是它被重置或即使在新选项卡中打开链接时也不会被读取。但我希望页面刷新/新选项卡的行为方式与页面刷新方式相同。

if (sessionStorage.getItem('reloaded') != null) {
    console.log('page was reloaded');
} else {
    console.log('page was not reloaded');
}

sessionStorage.setItem('reloaded', 'yes');

【问题讨论】:

  • 你能解释一下你想要达到的目标吗?这太笼统了。简而言之,您可以使用sessionStorage 跟踪页面刷新,仅当它在标签关闭时被清除。您可以将此数据与localStorage 同步以处理其他状态,但实际上取决于您到底要做什么。提供更多背景信息。
  • 我希望在页面刷新/新标签页上保留一些 JS 状态,但在页面关闭时删除
  • “页面关闭”是指标签页关闭吗?否则,请通过“页面关闭”来定义您所理解的内容。
  • 是的,关闭既是页面关闭又是标签关闭...

标签: javascript local-storage session-storage


【解决方案1】:

您必须结合使用sessionStoragelocalStorage 来保存数据并依靠beforeunload 事件来处理数据删除。

问题是beforeunload 在标签页/窗口关闭和页面刷新上都会触发,所以我们必须解决这个问题。

localStorage 将处理选项卡和窗口之间的持久性,sessionStorage 将在页面刷新时同步数据。

const readFromStorage = (storageKey) => {
    const localStorageItem = localStorage.getItem(storageKey);
    const sessionStorageItem = sessionStorage.getItem(storageKey);

    // You can optimize this by doing more checks but you get the idea
    const itemValue = localStorageItem ?? sessionStorageItem;

    if (localStorageItem !== sessionStorageItem) {
        writeToStorage(storageKey, itemValue);
    }

    return itemValue;
};

const writeToStorage = (storageKey, value) => {
    localStorage.setItem(storageKey, value);
    sessionStorage.setItem(storageKey, value);
};

事件处理程序:

window.addEventListener('beforeunload', (e) => {
    localStorage.removeItem(STORAGE_KEY);
});

用法:

const STORAGE_KEY = '<storage_key>';

const item = readFromStorage(STORAGE_KEY);

如果 itemnull - 选项卡/窗口已关闭。否则,数据将在刷新和新选项卡/窗口中保持不变。

【讨论】:

  • 谢谢...让我看看...但只是想知道 localStorageItem 是什么? sessionStorageItem 是什么意思?
  • 另外还需要添加一件事,在页面刷新时(或者甚至为此打开新标签页),有一个服务器调用会获得相同的状态值......所以只是想一想好吧....就像在页面刷新时(但不是在初始/首次加载时),读取/使用本地状态值(而不是服务器提供的值)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-16
  • 2018-09-26
  • 2020-09-25
  • 1970-01-01
  • 1970-01-01
  • 2018-01-09
相关资源
最近更新 更多