Menu

HTML 如何在新标签页打开链接(target _blank)

给链接加上 target="_blank",就能在新标签页中打开它。本页介绍 rel="noopener" 和 noreferrer,如何告诉用户链接会在新标签页中打开,target 的其他取值,以及如何用 JavaScript 实现。

本页包含可运行的编辑器。编辑、运行,立即查看输出。

用 target="_blank" 在新标签页中打开链接

给链接加上 target="_blank"。浏览器会在新标签页中打开目标页面,你的页面保持原样。

这就是全部的技巧:在 <a> 上加 target="_blank",再加上下一节会讲到的 rel="noopener"。读者也可以自己用 Ctrl+点击(Mac 上是 Cmd+点击)或鼠标中键在新标签页中打开任何链接,所以只有在离开页面会让他们有所损失时才使用 target="_blank",比如填了一半的表单或正在播放的视频。

本页的预览会把所有外部链接都在新标签页中打开,无论有没有 target,因为示例框架绝不能跳转到其他页面。要看 target 带来的区别,把示例保存为文件,再用浏览器打开。

rel="noopener" 和 rel="noreferrer"

用 target="_blank" 打开的页面过去能在 window.opener 中拿到指向你页面的引用,并可以利用它把你的标签页跳转到别的 URL(比如一个伪造的登录页面)。rel="noopener" 会移除这个引用。

rel 值新标签页中的 window.opener是否向新网站发送来源
不写(旧浏览器)你的页面是
不写(当前浏览器)null是
noopenernull是
noreferrernull否
opener你的页面是

当前版本的 Chrome、Firefox 和 Safari 会把每个 target="_blank" 链接都当作 noopener 处理,除非你写了 rel="opener"。即便如此,写上 rel="noopener" 仍然可以保护使用旧浏览器的访客,也让代码的意图一目了然。

noreferrer 还会阻止浏览器发送来源信息,所以你链接到的网站看不到访客来自哪个页面。这是出于隐私而不是安全的考虑:当你的 URL 需要保密时使用它;对于需要看到你带来的流量的合作伙伴,就不要加。

<!-- Safe, the other site still sees the referral -->
<a href="https://example.com" target="_blank" rel="noopener">Example</a>

<!-- Safe, and the other site does not see where the visit came from -->
<a href="https://example.com" target="_blank" rel="noopener noreferrer">Example</a>

rel 可以接受多个以空格分隔的值,所以 noopener 可以与 SEO 相关的值组合使用:付费链接用 rel="noopener sponsored",你不为之担保的链接用 rel="noopener nofollow"。

告诉用户链接会在新标签页中打开

毫无提示地打开新标签页会让人迷失方向,对使用屏幕阅读器的用户尤其如此,他们可能根本没注意到页面变了。在链接中说明这一点。一个小图标能让看得见的用户知道;隐藏的文字则告诉使用屏幕阅读器的用户:

a[target="_blank"] 选择器会自动给每个新标签页链接加上箭头,你永远不会漏掉一个。隐藏的 span 会作为链接名称的一部分被读出,即“accessibility guidelines (opens in a new tab)”,但不占屏幕空间。

自动标记所有外部链接

属性选择器可以根据 href 为链接设置样式。这里每个以 http 开头的链接都会带上箭头,站内链接则不会:

^= 的意思是“以……开头”。这个选择器只负责样式:target 和 rel 属性仍然必须写在 HTML 中。

target 的取值

target 指定链接在哪里打开。它有四个关键字,其他任何值都是一个名称:

target在哪里打开链接
_self同一个标签页或框架。这是默认值。
_blank一个新的、未命名的标签页
_parent当前框架的父框架(不在框架中时与 _self 相同)
_top整个标签页,跳出所有框架
任意名称,例如 help具有该名称的标签页或框架,不存在时会新建

命名的目标会被重复使用。所有 target="help" 的链接都会在同一个标签页中打开,所以读者点击五个帮助链接,得到的是一个标签页,而不是五个。在 <iframe> 中,如果链接应该替换整个页面而不是框架,就用 _top。

用 base 元素让所有链接在新标签页中打开

在 <head> 中写 <base target="_blank">,可以为页面上的每个链接和表单设置默认的目标:

<head>
  <base target="_blank">
</head>
<body>
  <a href="https://example.com">Opens in a new tab</a>
  <a href="/about" target="_self">Opens in this tab</a>
</body>

链接自己的 target 优先于 <base>。尽量少用这种方式:每个链接都打开新标签页的页面用起来很烦人。

用 JavaScript 打开新标签页

window.open(url, '_blank') 可以在脚本中打开标签页。把 'noopener' 作为第三个参数传入,就能得到与 rel 属性相同的保护。这样一来,window.open 会返回 null,而不是指向新标签页的引用:

除非 window.open 是在响应点击或按键时运行的,否则浏览器会拦截它,所以要在事件监听器中调用它,而不是在页面加载时或定时器之后调用。如果目标 URL 是读者事先就能看到的,用带 target="_blank" 的链接更简单,而且不需要 JavaScript 也能工作。链接本身的用法请看 HTML a 标签。

常见错误

  • 写成没有下划线的 target="blank"。 它是一个名称,而不是关键字。第一次仍然会打开新标签页,之后所有同名的链接都会复用那个标签页。
  • 写成 target="_new"。 它同样只是一个名称,效果也一样:只有一个被反复使用的标签页。
  • 给每个链接都加上 target。 站内链接应该在同一个标签页中打开。想要新标签页的读者知道该怎么做。
  • 没有提示链接会在新标签页中打开。 加上图标和隐藏文字。
  • 给合作伙伴或联盟推广链接加上 noreferrer,然后奇怪为什么合作方看不到你带去的流量。

常见问题

如何让 HTML 链接在新标签页中打开?

给 <a> 标签加上 target="_blank":<a href="https://example.com" target="_blank" rel="noopener">Example</a>。浏览器会在新标签页中打开页面,同时保留当前页面。

使用 target="_blank" 时还需要 rel="noopener" 吗?

当前版本的 Chrome、Firefox 和 Safari 会自动对 target="_blank" 链接应用 noopener,新页面无法再通过 window.opener 访问你的页面。写上 rel="noopener" 没有任何代价,还能保护使用旧浏览器的访客,所以大多数代码规范仍然要求写上它。

noopener 和 noreferrer 有什么区别?

noopener 切断两个标签页之间的联系(新标签页中的 window.opener 为 null)。noreferrer 除了这一点,还会阻止浏览器把你页面的 URL 作为来源发送出去,所以对方网站的统计会把这次访问视为直接访问。

HTML 能强制链接在新窗口而不是新标签页中打开吗?

不能。target="_blank" 请求的是一个新的浏览上下文,是标签页还是窗口由浏览器和用户的设置决定。当前的浏览器会打开标签页。

如何让页面上的所有链接都在新标签页中打开?

在 <head> 中加上 <base target="_blank">。所有没有自己 target 的链接都会在新标签页中打开。它也会影响表单,所以只在确实需要这样做的页面上使用。

Coddy 编程语言插图

和 Coddy 一起学编程

开始