我们有一个网站,其中包含指向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"
添加到链接中,我还能做些什么来保持原始行为。
答案 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 = ''; } )
(当然,请确保在文档加载后执行该操作。)