target="_blank"必须搭配rel="noopener noreferrer"才安全可用,否则现代浏览器会拦截或降级为当前页跳转,因新页面可通过window.opener劫持原页、阻塞主线程并泄露Referer。

target="_blank" 必须搭配 rel="noopener noreferrer"
只写 target="_blank" 在现代浏览器(Chrome、Firefox、Safari 16+、Edge)中大概率被拦截或强制降级为当前页跳转。这不是 bug,而是主动安全策略。原因有三:window.opener 可被新页面用于 tabnabbing 攻击;原页面 JS 执行可能被新页面阻塞;Referer 头默认泄露来源。必须同时设置 rel="noopener noreferrer" 才算完整。
商品详情页里哪些链接该开新窗口
外部链接必须新开——比如「查看品牌官网」「跳转第三方评测」「下载 PDF 规格书」。内部链接(如「同类商品」「店铺首页」)不建议用 target="_blank",会破坏单页体验和路由逻辑。特别注意 CMS 或富文本编辑器生成的商品描述,常过滤 rel 属性,需检查后台白名单是否放行 rel。
动态插入链接时最容易漏掉 rel
商品页常用 JS 拼接 HTML(如促销按钮、参数化跳转链接),这时极易只写 target="_blank" 而漏掉 rel。更稳妥的做法是:
- 用
document.createElement('a')创建元素 - 依次赋值:
link.href = url、link.target = '_blank'、link.rel = 'noopener noreferrer' - 插入前打印
link.outerHTML确认三项都在
服务端模板(如 Twig、Jinja)中也应统一补全,不能指望前端修补。
微信 WebView 和旧安卓浏览器不认 target
微信内置浏览器、部分旧版安卓 WebView 会直接忽略 target="_blank"。此时必须退回到 window.open(url, '_blank', 'noopener,noreferrer'),且确保调用发生在用户手势(如 click)内,否则会被静默拦截。另外,Vue/React 中的封装按钮组件或 不解析 target,必须退回原生 标签。
真正难的不是语法怎么写,而是确保每个外部链接——无论是手写、CMS 输出、还是 JS 动态注入——都稳定携带那三个字段:href、target="_blank"、rel="noopener noreferrer"。漏一个,就等于没做。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











