window.opener 引用在 Firefox 中丢失
window.opener reference lost in Firefox
考虑以下情况:
- 第 1 步:网站 A 在新选项卡中打开网站 B(此时网站 B 有其开启者 window 引用,即网站 A window 对象在 window.opener 中)。
- 第 2 步:网站 B 重定向到网站 C(我们也window.opener 引用了网站 A window)。
- 第 3 步:然后网站 C 执行一些身份验证并重定向回网站 B。
在这第 3 步,window.opener 具有当前 window 对象的引用,即网站 B 本身的 window 对象(window.opener === window),我们失去了对原始开启者的引用(即网站 A window 对象)。我们需要 window.opener 对象来使用 postMessage 与网站 A 通信。
Visual reperesentation of steps
注意:我们无法控制网站 C,也无法控制他们如何重定向回网站 B。
此外,这仅在 Firefox/Safari 上发生。在 Chrome 上,我们能够在重定向后获得原始的 opener 参考。
如果网站 C 使用 rel=noopener 重定向,window.opener 应该为空 (Reference from MDN)。我不明白在什么情况下 window.opener 可以是当前的 window 对象以及为什么它发生在 Firefox/Safari 而不是 Chrome?除了网站 C,我们还能在其他任何地方做些什么来防止这种情况发生吗?
这在 firefox 和 Safari 中是可能的,当您添加目标 _self
时,window.opener 可以是当前的 window。如果您这样做 window.open('someurl', '_self')
,那么 window.opener 将成为当前 window,并且将在同一选项卡中打开,而不是在新选项卡中打开。这只发生在 safari 和 firefox 中(据我观察)。所有基于 chromium 的浏览器在任何情况下都不会更改原始的 window opener。
我不知道safari和firefox这样处理的确切原因我试图找到原因但找不到。
我曾经遇到过这个问题,我们所做的解决方案是要求网站 C 使用 window.location.replace
或 window.location.href
重定向回网站 B,以便他们在同一选项卡中打开网站 b。
考虑以下情况:
- 第 1 步:网站 A 在新选项卡中打开网站 B(此时网站 B 有其开启者 window 引用,即网站 A window 对象在 window.opener 中)。
- 第 2 步:网站 B 重定向到网站 C(我们也window.opener 引用了网站 A window)。
- 第 3 步:然后网站 C 执行一些身份验证并重定向回网站 B。 在这第 3 步,window.opener 具有当前 window 对象的引用,即网站 B 本身的 window 对象(window.opener === window),我们失去了对原始开启者的引用(即网站 A window 对象)。我们需要 window.opener 对象来使用 postMessage 与网站 A 通信。
Visual reperesentation of steps
注意:我们无法控制网站 C,也无法控制他们如何重定向回网站 B。 此外,这仅在 Firefox/Safari 上发生。在 Chrome 上,我们能够在重定向后获得原始的 opener 参考。
如果网站 C 使用 rel=noopener 重定向,window.opener 应该为空 (Reference from MDN)。我不明白在什么情况下 window.opener 可以是当前的 window 对象以及为什么它发生在 Firefox/Safari 而不是 Chrome?除了网站 C,我们还能在其他任何地方做些什么来防止这种情况发生吗?
这在 firefox 和 Safari 中是可能的,当您添加目标 _self
时,window.opener 可以是当前的 window。如果您这样做 window.open('someurl', '_self')
,那么 window.opener 将成为当前 window,并且将在同一选项卡中打开,而不是在新选项卡中打开。这只发生在 safari 和 firefox 中(据我观察)。所有基于 chromium 的浏览器在任何情况下都不会更改原始的 window opener。
我不知道safari和firefox这样处理的确切原因我试图找到原因但找不到。
我曾经遇到过这个问题,我们所做的解决方案是要求网站 C 使用 window.location.replace
或 window.location.href
重定向回网站 B,以便他们在同一选项卡中打开网站 b。