我的网站中有一些值,我想在浏览器关闭时清除这些值.我 Select 了sessionStorage来存储这些值.当tab关闭时,它们确实被清除,如果用户按f5,它们将被保留;如果用户选项卡中的某些值不可用,则会打开这些链接.

如何使用我的应用程序在所有浏览器选项卡之间共享sessionStorage个值?

用例:将一个值放入一些存储中,在所有浏览器选项卡中保持该值可访问,并在所有选项卡关闭时清除该值.

if (!sessionStorage.getItem(key)) {
    sessionStorage.setItem(key, defaultValue)
}

推荐答案

您可以使用localStorage及其"存储"eventListener将会话存储数据从一个选项卡传输到另一个选项卡.

此代码需要存在于所有选项卡上.它应该在其他脚本之前执行.

// transfers sessionStorage from one tab to another
var sessionStorage_transfer = function(event) {
  if(!event) { event = window.event; } // ie suq
  if(!event.newValue) return;          // do nothing if no value to work with
  if (event.key == 'getSessionStorage') {
    // another tab asked for the sessionStorage -> send it
    localStorage.setItem('sessionStorage', JSON.stringify(sessionStorage));
    // the other tab should now have it, so we're done with it.
    localStorage.removeItem('sessionStorage'); // <- could do short timeout as well.
  } else if (event.key == 'sessionStorage' && !sessionStorage.length) {
    // another tab sent data <- get it
    var data = JSON.parse(event.newValue);
    for (var key in data) {
      sessionStorage.setItem(key, data[key]);
    }
  }
};

// listen for changes to localStorage
if(window.addEventListener) {
  window.addEventListener("storage", sessionStorage_transfer, false);
} else {
  window.attachEvent("onstorage", sessionStorage_transfer);
};


// Ask other tabs for session storage (this is ONLY to trigger event)
if (!sessionStorage.length) {
  localStorage.setItem('getSessionStorage', 'foobar');
  localStorage.removeItem('getSessionStorage', 'foobar');
};

我在Chrome,ff,Safari,IE11,IE10,IE9中进行了测试

这种方法"应该在IE8中有效",但我无法测试它,因为每次打开标签时,我的IE都会崩溃....任何账单...在任何网站上.(好的ol IE)PS:如果你还想要IE8支持,显然需要包含一个JSON垫片

这篇完整的文章值得赞扬:

Javascript相关问答推荐

当promise 在拒绝处理程序被锁定之前被拒绝时,为什么我们会得到未捕获的错误?

实现JS代码更改CSS元素

JQuery Click事件不适用于动态创建的按钮

如何在ASP.NET项目中使用Google Chart API JavaScript将二次轴线值格式化为百分比

如何创建返回不带`new`关键字的实例的类

在开发期间,Web浏览器如何运行&qot;.jsx&qot;文件?

Reaction-SWR-无更新组件

无法读取未定义的属性(正在读取合并)-react RTK

基于产品ID更新条带产品图像的JavaScript命中错误

使用线性插值法旋转直线以查看鼠标会导致 skip

是否可以在不更改组件标识的情况下换出Reaction组件定义(以维护状态/引用等)?如果是这样的话,是如何做到的呢?

谷歌饼图3D切片

如何在Reaction中设置缺省值, Select 下拉列表,动态追加剩余值?

如何设置时间选取器的起始值,仅当它获得焦点时?

如何调整下拉内容,使其不与其他元素重叠?

Rails 7:在不使用导入映射的情况下导入Java脚本

如何在单击链接时设置一个JavaScript变量(以打开弹出窗口的特定部分)

在采购unpept-visalizations.js时遇到问题

try 导入material 时出现错误NG0203

将promise列表拆分到组.按组并行和顺序执行所有promise