window.opener 引用在 Firefox 中丢失

Vis*_*Pal 5 html javascript firefox

考虑以下情况:

\n
    \n
  • 步骤1:网站A在新选项卡中打开网站B(此时网站B有其打开器窗口引用,即window.opener中的网站A窗口对象)。
  • \n
  • 步骤 2:网站 B 重定向到网站 C(这里也有 window.opener 引用网站 A 窗口)。
  • \n
  • 步骤 3:然后网站 C 执行一些身份验证并重定向回网站 B。\n在第 3 步,window.opener 具有当前窗口对象的引用,即网站 B 本身的窗口对象(window.opener === window)并且我们\xe2\x80\x99已经失去了对原始打开器(即网站A窗口对象)的引用。我们需要 window.opener 对象来使用 postMessage 与网站 A 进行通信。
  • \n
\n

步骤的视觉表示

\n

注意:我们\xe2\x80\x99t无法控制网站C,并且可以\xe2\x80\x99t控制它们\xe2\x80\x99如何重定向回网站B。\n而且这种情况仅发生在Firefox/Safari上。在 Chrome 上,我们能够在重定向后获取原始的 opener 引用。

\n

如果网站 C 使用 rel=noopener 进行重定向,则 window.opener 应为 null(来自 MDN 的参考)。我\xe2\x80\x99m 无法理解在这种情况下 window.opener 可以是当前窗口对象以及为什么它发生在 Firefox/Safari 而不是 Chrome 上?除了网站 C 之外,我们还能在其他地方做些什么来防止这种情况发生吗?

\n

小智 4

这在 Firefox 和 Safari 中是可能的,当您添加 target 时, window.opener 可以是当前窗口_self。如果这样做window.open('someurl', '_self'),则 window.opener 将是当前窗口,并将在同一选项卡而不是新选项卡中打开。这只发生在 Safari 和 Firefox 中(根据我的观察)。所有基于 chromium 的浏览器在任何情况下都不会更改原始的窗口打开器。

我不知道safari和firefox这样处理的确切原因我试图找到原因但找不到。

我曾经遇到过这个问题,我们所做的解决方案是要求网站 C 使用window.location.replacewindow.location.href重定向回网站 B,以便他们在同一选项卡中打开网站 B。