浏览器标签页存储?

27

有没有一种浏览器存储只能被创建它的页面使用?

我正在制作一个TamperMonkey脚本来自动化我的工作。当打开特定域名下的页面时,它会被触发。然后,它会在该页面中查找一个特定链接(同一域名),并在同一标签页中打开它。如果新打开的页面符合条件,它会返回到上一页(需手动检查)。如果不符合,则会关闭自己。

我使用了localStorage来标记页面是否尝试进行此检查。否则,脚本将在重新加载原始页面时重复打开该链接并进入循环。

当只运行单个选项卡时,脚本运行顺畅。但当我运行多个选项卡(均在同一域内)时,它经常失败。我猜测每个选项卡可以访问相同的localStorage,从而干扰循环检查。我还没有找到任何方法通过同一脚本为每个选项卡的localStorage提供唯一的名称。

因此,我需要一种浏览器存储,即使在打开同一域中的新URL之后,该存储也可以由选项卡使用,但无法被具有相同域的另一个选项卡使用。


你是否在寻找类似 sessionStorage 的东西? - Kaiido
我有这样的印象,sessionStorage只是在会话结束后被删除的localStorage。除此之外,它们之间还有其他区别吗? - Ray Arifin
对于你的情况来说,是的。会话仅在主窗口和由其打开的窗口之间共享。 - Kaiido
我已经解决了这个问题。原来是与另一个脚本发生了冲突。现在一切都很顺利。谢谢! - Ray Arifin
1个回答

36
你可以使用 Window.sessionStorage 来实现这个目的。 示例

// Store in `name` in the current tab

sessionStorage.setItem('name', 'Some Name');

// Get `name` from sessionStorage

var name = sessionStorage.getItem('name');


alert(name); // Some Name

根据MDN的说法:
sessionStorage属性允许您访问当前源的会话存储对象。sessionStorage与Window.localStorage类似,唯一的区别是localStorage中存储的数据没有设置过期时间,而sessionStorage中存储的数据在页面会话结束时被清除。页面会话持续的时间与浏览器打开的时间一样长,并且在页面重新加载和恢复时保留。在新标签页或窗口中打开页面将导致启动新的会话,这与会话cookie的工作方式不同。

1
如果多个选项卡同时运行脚本会怎样?当脚本在这种情况下运行时,我的脚本会失败。我怀疑是因为a)新打开的选项卡可以访问另一个选项卡的localStorage并对其进行修改,或者b)每当打开一个新选项卡时,localStorage就被清除。所有这些选项卡都来自同一个域,并且运行相同的脚本,因此创建和修改具有相同名称的localStorage。 - Ray Arifin
8
“localStorage”和“sessionStorage”有区别。如果你使用“sessionStorage”,那么用户在打开两个标签时不会有问题,每个标签都有自己的“sessionStorage”。 - Mohamed Abbas

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接