如何在使用target =“_ blank”/window.open()打开新窗口/选项卡时阻止sessionStorage被继承?

时间:2014-01-02 09:19:38

标签: javascript sessionstorage

在带有网址http://foo.com/的标签页上,我设置了一个sessionStorage项目 -

sessionStorage.bar="hello";

然后我在同一个域的任何路径上打开一个新窗口 -

window.open("http://foo.com/any/path");

然后在新窗口中我发现 -

sessionStorage.bar === "hello"

是真的。如果我使用带有target =“_ blank”属性的链接打开新窗口,则会发生完全相同的事情。打开新选项卡时也会发生完全相同的事情,而不是新窗口。另外需要注意的是,这只适用于在打开新窗口之前在sessionStorage上设置的项目。在打开新窗口后,在任一窗口中添加或更改sessionStorage上的任何项目都不会以任何方式影响其他窗口。

我认为sessionStorage应该被限定为单个选项卡/窗口,但是当从另一个窗口打开时,sessionStorage显然会扩展到新的选项卡和窗口。

有没有办法防止这种情况发生?我可以测试window.opener的存在来检测这样的情况,但是如果可以首先防止它那么会更清洁。

谢谢!

4 个答案:

答案 0 :(得分:5)

根据Webstorage Specification,“在具有顶级浏览上下文的浏览上下文中创建新文档时,用户代理必须检查该顶级浏览上下文是否具有会话存储该文档原点的区域。如果是,那就是文档指定的会话存储区域。“

因此,我对此的看法是,如果您关闭选项卡,然后打开一个新选项卡,它将是每个规范的新“会话”。但是,如果选项卡保持打开状态,然后您打开一个新选项卡,则顶级浏览上下文匹配,因此会引用sessionStorage。

答案 1 :(得分:0)

您可以通过在每个窗口中使用单独的键来解决继承行为(或者,如果您有多个键,则可以对每个键应用一些唯一的前缀)。

这就引出了每个窗口如何分配/保留唯一键的问题。好吧,SessionStorage is not empty when link opened in new tab in Internet Explorer显示了您可以将每个窗口的名称设置为某个唯一值,该值将在重新加载后保留。

答案 2 :(得分:0)

你可以这样使用:

    const a = document.createElement('a');
    a.href = "http://example.com/any/path";
    a.target = '_blank';
    document.body.appendChild(a);
    a.click();
    document.body.removeChild(a);

答案 3 :(得分:0)

我通过在打开新窗口时临时删除会话项来解决这个问题。

sessionStorage.removeItem('bar');
window.open('http://example.com/any/path', '_blank');
sessionStorage.setItem('bar', 'hello');