打开新窗口时sessionStorage不为空,当使用target="_blank"的链接跳转时。

13

我注意到在跟随超链接时,HTML5 sessionStorage 会表现出不同的行为。有时候第一个页面的sessionStorage 会被复制到目标页面,有时候我会得到一个空的sessionStorage。

有人能解释一下这是为什么吗?

给定以下链接:

<a href="TargetPage.html" target="_blank">link</a>

当我使用右键点击链接并选择“在新标签页中打开链接”时,TargetPage 页面的 sessionStorage 为空。(预期行为) 但是,当我使用常规左键点击链接时,sessionStorage 就会被复制到 TargetPage 页面。(意外行为)

注意:我在 Chrome 和 Firefox 中看到了这种行为。Internet Explorer 9 在两种情况下都提供空的 sessionStorage。这是我的预期行为。

我创建了一个 jsFiddle 来演示这种行为:http://jsfiddle.net/P9nUv/3/

有谁能想到一个跨浏览器的解决方案,确保无论如何打开新的浏览器标签页或窗口,都会得到一个空的 sessionStorage?

感谢任何帮助!

2个回答

6

在我看来:

我认为问题在于不同的浏览上下文。在W3C webStorage规范中有一段话:

当一个新的文档在已有顶级浏览上下文的浏览上下文中被创建时,用户代理必须检查该顶级浏览上下文是否拥有该文档来源的会话存储区域

这里的Document指的是新页面。这意味着,如果您在新标签页中打开相同的页面,则会使用相同的浏览上下文和相同的sessionStorage,但是如果在新窗口中打开(即target="_blank"),则浏览上下文是不同的。

或者

问题可能在于单独的CPU线程,因此有单独的浏览上下文和单独的sessionStorage


我认为可能是这种情况:当现有浏览上下文中的脚本创建新的顶级浏览上下文,或者用户在现有浏览上下文中跟随链接创建新的顶级浏览上下文,或以某种与特定文档相关的方式创建新的顶级浏览上下文,并且该创建不是会话存储的新启动时,则在创建新的浏览上下文时必须将该文档的来源的会话存储区域复制到其中。从那时起,但是,这两个会话存储区域必须被视为分开的,彼此不会产生任何影响。 - halface_sun

3

又是一个古老的问题,但我在这个网站上没有找到任何关于Firefox 44的答案。 我找到了一个解决方法,你可以在这里找到:https://dev59.com/3IDba4cB1Zd3GeqPKekX#35596134

希望这可以帮到你。


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