10

在带有 url 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

4 回答 4

4

根据Webstorage Specification,“当在具有顶级浏览上下文的浏览上下文中创建新文档时,用户代理必须检查该顶级浏览上下文是否具有该文档来源的会话存储区域。如果是这样,那么这就是文档分配的会话存储区域。”

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

于 2014-01-02T10:09:25.920 回答
1

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

sessionStorage.removeItem('bar');
window.open('http://example.com/any/path', '_blank');
sessionStorage.setItem('bar', 'hello');
于 2021-06-13T14:35:40.987 回答
0

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

这就引出了如何为每个窗口分配/保留唯一键的问题。好吧,当在 Internet Explorer 的新选项卡中打开链接时,SessionStorage 不为空,这表明您可以将每个窗口的名称设置为某个唯一值,该值在重新加载时保留。

于 2019-08-20T02:52:08.943 回答
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);
于 2021-06-08T09:16:52.707 回答