有没有办法检测Tab键关闭事件以清除localStorage
。我需要localStorage
来跨选项卡共享数据。window.onbeforeunload
事件运行良好,但对我来说有两个问题:
1.它还会在页面刷新时触发,这是我不想要的。
1.我不需要选项卡关闭时的确认框。
就像关闭Windows时一样,sessionStorage
会被清除。同时,我可以清除localStorage
,但不知道绑定到什么事件。我检查了几个已有的问题,但似乎都没有解决这个问题,有一些解决方法是使用用于点击链接和表单提交的标志,但不是一种干净的方法。对于这个问题,请提出任何解决方案。
7条答案
按热度按时间gopyfrb31#
我知道这是一个老问题,但我只是在寻找解决方案,但我找不到任何正常工作的东西。然后我想出了一个解决方案,对我来说效果很好。
我所做的是改变视角,而不是在浏览器关闭时清除本地存储,而是决定在打开时清除它。用户看不到其中的区别。
我刚刚设置了一个函数,用于在加载页面时检查会话存储,如果为空,该函数将清除本地存储;之后,它会将
register
设置为会话存储,以确保本地存储不会因为重新加载页面而再次被清空。2wnc66cl2#
我找到了解决这个问题的办法,并想到了分享。由于window.onbepreunLoad事件在浏览器/选项卡关闭时触发,但也在刷新时触发(这是我不想要的),所以我的本地存储也在rresh时被处理。这是我不想要的。为了克服这个问题,我又实现了一个事件处理程序window.onLoad,它只在刷新时触发,而不是在选项卡/浏览器关闭时触发,在选项卡/浏览器关闭时,我会重置本地存储,就像什么都没有发生一样。代码是:
我在window.onbepreunLoad中返回未定义,因为我不希望在选项卡/浏览器关闭和刷新时出现确认弹出窗口。
x0fgdtte3#
检查window.onbepreunLoad事件和window.onLoad事件之间的时间,如果不到3秒,则保持会话活动,否则删除令牌。
5hcedyr04#
使用Cookie来解决这个问题,Cookie值会在浏览器关闭时自动删除,在我的例子中,我使用的是带有令牌的API,它存储在本地存储中,所以当浏览器关闭或关闭它时,不会注销用户,所以我所做的是
登录后,只需使用键‘loginatus’和值‘loggedin’设置cookie即可
在使用本地存储值检查用户日志的方法中
如果Cookie值不存在,则通过删除本地存储内标识进行修改
而且成功了!
4xy9mtcn5#
请改用
SessionStorage
。每当选项卡关闭时,它都会被清除。ej83mcc06#
我知道这个问题很古老,但也许有人仍然需要它。
这个解决方案不是很好,但效果很好:
关闭/重载时,会话存储中会存储一个临时令牌,重载时会查询该临时令牌。仅当令牌存在且loginMode为FALSE时,才会删除存储。
ibps3vxo7#
另外,印尼语是我的母语,所以如果我不擅长用英语解释,我很抱歉。
如果您想要在选项卡刷新时保持上一个操作,但想在选项卡关闭时清除上一个操作,那么我真的建议您使用会话存储而不是本地存储。因为据我所知,如果您使用本地存储,那么当您清除浏览器历史记录时,您的最后一个操作将被自动清除,这意味着如果您想要手动清除最后一个操作(例如,您希望在选项卡关闭时将其清除),那么您必须使用localStorage.emoveItem(‘’)。但是..。如果您使用会话存储,那么当您关闭选项卡时,您的上一次操作将被自动清除(即使您从未关闭浏览器)。这意味着,只要你不关闭加载URL/页面的选项卡,你的上一次操作就会一直保持下去。因此,如果您关闭该选项卡(但不关闭浏览器),只需在新选项卡中再次加载URL/页面,则会话存储将处于其初始值/状态,因为当您关闭该选项卡时,您在会话存储中的上一次操作将自动删除。
如果你想要一个例子,这里是我的完整代码,我通过谷歌搜索了近一周的时间获得的。顺便说一句,我在这里使用运行代码片段检查了结果,所以即使它看起来有问题,也只需尝试在这里保存我的html文件并在浏览器中打开它。因为我使用Visual Studio代码来编辑和运行html文件,即使我在Chrome中打开该文件,它也运行得很好。顺便说一句,如果你想让你的页面对用户更方便,你可以把ALERT(‘’)改成sole.log(‘’)。