如何在浏览器窗口/选项卡关闭时删除localStorage项目?

Yos*_*sef 371 javascript jquery html5 local-storage

我的案例:带有键+值的localStorage应该在浏览器关闭时删除,而不是单个标签.

请查看我的代码是否正确以及可以改进的内容:

//create localStorage key + value if not exist
if(localStorage){
   localStorage.myPageDataArr={"name"=>"Dan","lastname"=>"Bonny"}; 
}

//when browser closed - psedocode
$(window).unload(function(){
  localStorage.myPageDataArr=undefined;
});
Run Code Online (Sandbox Code Playgroud)

Yos*_*sef 744

应该这样做而不是删除操作符:

localStorage.removeItem(key);
Run Code Online (Sandbox Code Playgroud)

  • 我不明白这是一个合理的应急计划.语言允许人们做破坏性的事实并不意味着你应该采用非标准的方式来使用库来防止滥用语言.如果您或您的开发人员不了解调用和分配之间的区别,那么您遇到的问题远比从localStorage中删除项目的问题要大得多. (30认同)
  • 如果它有效,你可以在技术上使用它.但是考虑到removeItem是作为成员函数提供的,使用它似乎是合乎逻辑的,而不是使用单独的运算符运行到潜在的未定义行为. (6认同)
  • @skeggse这就是为什么首先写一个`localStorage.key = 1`是个坏主意 - 以避免这种事故 (3认同)

vin*_*eet 103

window全局关键字一起使用: -

 window.localStorage.removeItem('keyName');
Run Code Online (Sandbox Code Playgroud)

  • 为什么要使用window对象?只需`localStorage.removeItem(key)`工作正常. (6认同)
  • 看看这个链接http://stackoverflow.com/questions/5319878/which-is-the-better-option-to-use-localstorage-window-localstorage-or-doc (3认同)

MT.*_*MT. 93

您可以beforeunload在JavaScript中使用该事件.

使用vanilla JavaScript可以执行以下操作:

window.onbeforeunload = function() {
  localStorage.removeItem(key);
  return '';
};
Run Code Online (Sandbox Code Playgroud)

这将在浏览器窗口/选项卡关闭之前删除密钥,并提示您确认关闭窗口/选项卡操作.我希望能解决你的问题.

注意:该onbeforeunload方法应返回一个字符串.

  • @dhsto VanillaJS是简单的JavaScript :)看这里:[什么是VanillaJS?](http://stackoverflow.com/questions/20435653/what-is-vanillajs). (8认同)
  • 一个问题是,即使您在同一页面上导航,也会调用它,而不仅仅是在选项卡关闭时调用,这可能不是预期的。旁注:从 onbeforeunload 返回 undefined 将禁用卸载时显示的消息。 (2认同)

小智 89

如果您希望在浏览器关闭时删除密钥,则应使用sessionStorage.

  • "sessionStorage"的问题在于,当您打开新选项卡时不会存储它,例如使用ctrl单击链接.我需要一个localStorage/sessionStorage混合大声笑. (25认同)
  • +1提及`sessionStorage`,但[W3C编辑的草案](http://dev.w3.org/html5/webstorage/#the-sessionstorage-attribute)说:'浏览上下文的生命周期可能与实际用户代理进程本身的生命周期,因为用户代理可能支持在重新启动后恢复会话. (8认同)
  • 这是最好的答案; `sessionStorage`是提问者描述的补救措施. (3认同)
  • @EdwinStoteler我也是.当他们以这种方式设计时,我有点困惑.我真的需要访问一个仅在内存中的浏览器存储,当浏览器关闭时它会被销毁.我希望以可在整个域中访问的方式存储敏感信息,但我不希望该信息访问任何硬盘. (3认同)

Raf*_*ues 19

尝试使用

$(window).unload(function(){
  localStorage.clear();
});
Run Code Online (Sandbox Code Playgroud)

希望这对你有用

  • 这将清理整个本地存储.不好解决! (9认同)
  • 你想清除完整的localStorage吗?如果是这样,只需使用`localStorage.clear();` (2认同)

小智 12

有一个非常具体的用例,其中任何使用sessionStorage而不是localStorage的建议都没有真正帮助.用例可能就像在打开至少一个选项卡时存储一些内容一样简单,但如果关闭剩余的最后一个选项卡,则会使其无效.如果你需要将你的值保存在交叉表和窗口中,sessionStorage对你没有帮助,除非你和听众一样使你的生活变得复杂,就像我试过的那样.与此同时,localStorage对此非常适合,但它"工作得太好",因为即使重新启动浏览器,您的数据也会在那里等待.我最终使用了利用两者的自定义代码和逻辑.

我宁愿解释然后给代码.首先在localStorage中存储您需要的内容,然后在localStorage中创建一个计数器,其中包含您已打开的选项卡数.每次页面加载时都会增加,每次页面卸载时都会减少.你可以在这里选择要使用的事件,我建议'加载'和'卸载'.在卸载时,您需要在计数器达到0时执行您想要的清理任务,这意味着您正在关闭最后一个选项卡.这里有一个棘手的部分:我没有找到一种可靠而通用的方法来区分页面重新加载或页面内部导航与选项卡关闭之间的区别.因此,如果您存储的数据不是可以在检查这是第一个选项卡后重新加载的数据,那么您无法在每次刷新时将其删除.相反,您需要在每次加载时在sessionStorage中存储一个标志,然后再增加选项卡计数器.在存储此值之前,您可以检查它是否已经有值,如果没有,这意味着您第一次加载到此会话中,这意味着您可以在加载时进行清理未设置值且计数器为0.

  • 我认为最好的实现是browserWatcher服务,它基本上会触发其他组件可以监听的事件(即浏览器打开,浏览器关闭,浏览器加载,浏览器卸载等等,并隐藏其中的所有这些实现细节每个组件可以决定它需要处理哪些事件才能完成它的工作.我唯一的问题是如果电源被切断到机器上会发生什么,那么这些属性将在下次打开浏览器时保留在localStorage中? (2认同)

Dil*_*anG 11

使用sessionStorage

sessionStorage对象等于localStorage对象,只是它只存储一个会话的数据.用户关闭浏览器窗口时将删除数据.

以下示例计算用户在当前会话中单击按钮的次数:

if (sessionStorage.clickcount) {
    sessionStorage.clickcount = Number(sessionStorage.clickcount) + 1;
} else {
    sessionStorage.clickcount = 1;
}
document.getElementById("result").innerHTML = "You have clicked the button " +
sessionStorage.clickcount + " time(s) in this session.";
Run Code Online (Sandbox Code Playgroud)

  • 数据将在浏览器选项卡关闭时被删除。 (2认同)

Wil*_*ich 10

localStorage.removeItem(key);  //item

localStorage.clear(); //all items
Run Code Online (Sandbox Code Playgroud)


小智 10

有五种方法可供选择:

  • setItem():给localStorage添加key和value
  • getItem():从localStorage中通过key检索一个值
  • removeItem():从localStorage中通过键删除一个项目
  • clear():清除所有localStorage
  • key():传递一个数字来检索 localStorage 的第 n 个键

您可以使用 clear(),调用此方法时会清除该域的所有记录的整个存储。它不接收任何参数。

window.localStorage.clear();
Run Code Online (Sandbox Code Playgroud)


小智 7

for (let i = 0; i < localStorage.length; i++) {
    if (localStorage.key(i).indexOf('the-name-to-delete') > -1) {
        arr.push(localStorage.key(i));
    }
}

for (let i = 0; i < arr.length; i++) {
    localStorage.removeItem(arr[i]);
}
Run Code Online (Sandbox Code Playgroud)


小智 6

这对于对象来说就可以了。

localStorage.removeItem('key');
Run Code Online (Sandbox Code Playgroud)

或者

localStorage.setItem('key', 0 );  
Run Code Online (Sandbox Code Playgroud)


Ric*_*unn 5

8.5 年后,最初的问题从未真正得到解答。

当浏览器关闭而不是单个选项卡时。

这个基本的代码片段将为您提供两全其美的好处。仅与浏览器会话(如 sessionStorage一样持续存在的存储,但也可在选项卡之间共享(localStorage)。

它纯粹是通过 localStorage 来实现的。

function cleanup(){
    // place whatever cleanup logic you want here, for example:
    // window.localStorage.removeItem('my-item')
}

function tabOpened(){
    const tabs = JSON.parse(window.localStorage.getItem('tabs'))
    if (tabs === null) {
        window.localStorage.setItem('tabs', 1)
    } else {
        window.localStorage.setItem('tabs', ++tabs)
    }
}

function tabClosed(){
    const tabs = JSON.parse(window.localStorage.getItem('tabs'))
    if (tabs === 1) {
        // last tab closed, perform cleanup.
        window.localStorage.removeItem('tabs')
        cleanup()
    } else {
        window.localStorage.setItem('tabs', --tabs)
    }
}

window.onload = function () {
    tabOpened();
}

window.onbeforeunload = function () {
    tabClosed();
}

Run Code Online (Sandbox Code Playgroud)