2017-06-21 145 views
1

是否有只能由创建它的页面使用的浏览器存储?浏览器标签存储?

我正在做一个TamperMonkey脚本来自动完成我的工作。它在来自特定域的页面打开时触发。然后,它会在所述页面中找到特定的链接(相同的域),并在同一个标​​签中打开它。如果新打开的页面与条件匹配,则会返回到上一页(手动检查)。如果没有,那么它会自行关闭。

我使用localStorage的标记,如果一个页面已经尝试做此项检查。否则,脚本会在原始页面加载并陷入循环时重新打开该链接。

脚本运行平稳只有一个选项卡运行时。但是当我运行多个选项卡时(全部在同一个域中),它往往会失败。我猜测每个标签都可以访问相同的localStorage,从而搞乱了循环检查。无论如何我还没有找到通过相同的脚本给每个标签的localStorage一个独特的名字。

因此,我需要一个浏览器存储,可用于由制表即使它在同一个域中打开一个新的URL,但不具有相同的域的另一个选项卡可用。

+0

你在寻找类似['sessionStorage'(https://developer.mozilla.org/en-US/docs/Web/API/Window/sessionStorage) ? – Kaiido

+0

我得到了sessionStorage只是在会话结束后被删除的localStorage的印象。两者之间有没有其他区别? –

+0

很适合你的情况,是的。会话仅在主窗口和由其打开的窗口之间共享。 – Kaiido

回答

2

您可以使用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的工作方式不同。

Source

+0

如果多个选项卡同时运行脚本,该怎么办?当它在该条件下运行时,我的脚本失败。我怀疑这是因为:a)新打开的选项卡可以访问另一个选项卡的localStorage并对其进行修改,或者b)只要打开新选项卡,localStorage就会被擦除干净。所有这些选项卡来自同一个域并运行相同的脚本,因此使用相同的名称创建和修改localStorage。 –

+0

@RayArifin有localStorage'和'sessionStorage' '之间的差别,如果你使用'sessionStorage'那么如果用户打开两个标签是没有问题的。每个标签都有自己的'sessionStorage'。 –