为什么带有 rel="noopener noreferrer" 的链接总是在新标签页中打开?

Why do links with rel="noopener noreferrer" always open in a new tab?

我们有一个网站有多个 link 到一个网络应用程序。预期的行为是第一次单击任何 link 应在新选项卡中打开 Web 应用程序,任何后续单击都应在同一新选项卡中打开 Web 应用程序。

我们这样做是因为我们的用户只希望同时打开一个 Web 应用程序实例。

这适用于将 target 属性添加到 links:

<a https://example.com" target="webapp-tab">Link 1</a>
<a https://example.com" target="webapp-tab">Link 2</a>

但我们的 CMS 会自动将 rel="noopener noreferrer" 添加到所有 link,因此 link 将如下所示:

<a https://example.com" target="webapp-tab" rel="noopener noreferrer">Link 1</a>
<a https://example.com" target="webapp-tab" rel="noopener noreferrer">Link 2</a>

问题是这改变了行为。现在,每次单击任何 link 都会打开一个新选项卡。

行为发生变化是否有具体原因?据我了解,区别仅在于请求不会发送推荐人和开启者信息,但为什么它会在新选项卡中打开?

即使 rel="noopener noreferrer" 被添加到 link 中,我能做些什么来保持原来的行为吗?

but why does it open in a new tab?

好像是这样指定的,https://developer.mozilla.org/en-US/docs/Web/HTML/Link_types说:

Note that when noopener is used, nonempty target names other than _top, _self, and _parent are all treated like _blank in terms of deciding whether to open a new window/tab.

我的猜测 - 如果应用程序本身指定了不同的选项卡名称,可能会担心某些不应该泄漏的信息仍然可能泄漏 - 例如,如果不同的脚本打开了具有该名称的选项卡首先,但没有 noopener - 然后它可以引用该选项卡,并且稍后当用户打开明确包含 noopener 的 link 时仍使用该引用访问内容设置。

Is there anything I can do to keep the original behaviour even if rel="noopener noreferrer" is added to the links.

这可能会破坏此功能最初应该提供的安全性。

您可以尝试在文档加载后使用 JS 运行,并让它从那些 link 中删除 rel 属性,resp。从其值中删除 noopener 部分。

那么您当然不会获得此功能提供的任何“保护”,但在同一选项卡中打开所有 link 应该仍然有效。


编辑:将具有此特定 target 集的所有 link 的属性值设置为空字符串的一种简单方法是

document.querySelectorAll('[target="webapp-tab"]').forEach(function(e) { e.rel = ''; } )

(当然,确保在文档加载后执行。)