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

时间:2019-12-12 09:52:54

标签: html hyperlink href

我们有一个网站,其中包含指向Web应用程序的多个链接。预期的行为是,对任何链接的第一次单击都应在新选项卡中打开Web应用程序,任何后续单击都应在同一新选项卡中打开Web应用程序。

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

这可以通过向链接添加target属性来实现:

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

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

<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>

问题在于这会改变行为。现在,每次点击任意链接都会打开一个新标签。

是否有特定原因导致行为改变?据我了解,区别仅在于请求不会发送引荐来源和公开者信息,但是为什么要在新标签页中打开呢?

即使将rel="noopener noreferrer"添加到链接中,我还能做些什么来保持原始行为。

1 个答案:

答案 0 :(得分:1)

  

但是为什么要在新标签页中打开它?

似乎是用这种方式指定的,https://developer.mozilla.org/en-US/docs/Web/HTML/Link_types说:

  

请注意,在使用noopener时,在决定方面,除_top_self_parent以外的非空目标名称都被视为_blank是否打开新窗口/标签。

我的猜测-应用程序本身指定了不同的标签页名称,可能有人担心某些本不应该泄漏的信息仍然可能泄漏-例如,如果其他脚本首先打开了具有该名称的标签页,但没有noopener-那么它可以引用该选项卡,并且当用户打开明确设置了noopener的链接时,仍然可以使用该引用来访问内容。

  

即使将rel =“ noopener noreferrer”添加到链接中,我还能做些什么来保持原始行为。

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

不过,您可以尝试在文档加载后让JS在您的文档上运行,并使其从那些链接中删除rel属性,分别。从其值中删除noopener部分。

然后,您当然不会获得此功能提供的任何“保护”,但是在同一选项卡中打开所有链接仍然应该起作用。


编辑:对于设置了此特定target的所有链接,将属性值设置为空字符串的简单方法是

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

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