target="_blank"需配rel="noopener noreferrer"防 opener 安全风险;_self 默认且冗余;_parent/_top 作用于框架层级;spa中target对前端路由无效。

target="_blank" 会新开标签页,但默认有安全风险
直接写 target="_blank" 确实能让链接在新标签页打开,但现代浏览器会默认给这个新页面赋予 window.opener 权限——也就是说,新页面能通过 window.opener.location 反向控制原页面跳转,甚至执行脚本。这不是理论漏洞,而是真实被用于钓鱼和恶意重定向的攻击路径。
必须同时加上 rel="noopener noreferrer" 才能切断这种权限继承:
<a href="https://example.com" target="_blank" rel="noopener noreferrer">安全的新页链接</a>
-
rel="noopener"是关键,它让新页面无法访问window.opener -
noreferrer是补充,还能阻止Referer头泄露来源 URL(部分场景需要) - 如果只加
noreferrer不加noopener,在旧版 Safari 中仍存在 opener 访问风险
target="_self" 是默认行为,显式写出来多数是冗余
除非你之前在父级元素(比如 <base> 标签或 iframe 的 name)里改过默认 target,否则 target="_self" 和不写 target 完全等价。它只是把当前上下文(通常是主窗口或当前 iframe)作为目标,并不会“强制刷新当前页”或“避免历史记录”。
常见误用场景:
- 想防止用户后退时回到上一页?
target="_self"做不到,得用history.replaceState() - 在 iframe 里点击却跳出了 iframe?那是因为
<iframe></iframe>没设name,而链接用了target="xxx"匹配失败,回退到顶层窗口——这时候该检查name而不是硬加_self - 某些 CMS 或编辑器自动生成
target="_self",纯属模板冗余,可安全删掉
除了 _blank 和 _self,还有三个实用但易错的 target 值
HTML 规范定义了几个特殊关键字,实际开发中容易因拼写或作用域理解错误导致失效:
使用 PptxGenJS 和 Python 解析,将结构化的 HTML/CSS 幻灯片内容转换为原生、可编辑的 PowerPoint(.pptx)演示文稿。
-
target="_parent":在直接父框架中加载,如果当前不在 iframe 里,就等同于_self;注意不是“所有父级”,只认 immediate parent -
target="_top":加载到最顶层窗口,常用于 iframe 内页想“破框”跳出;但如果页面本身没被嵌套,效果也等于_self -
target="some-name"(自定义名称):需与<iframe name="some-name"></iframe>或<frame name="some-name">严格匹配,大小写敏感,且不能含空格或特殊字符
错误示例:target="myFrame "(末尾空格)或 target="MyFrame" 匹配 <iframe name="myframe"></iframe> 都会失败,最终降级为 _blank(在部分浏览器中)或 _self(在另一些中),行为不一致。
target 属性在现代单页应用(SPA)中基本失效
Vue、React、Svelte 这类框架接管了路由,<a></a> 标签若指向同域下的相对路径(如 /user/123),点击后通常不会触发页面跳转,而是由前端路由拦截并更新视图。此时 target 完全不起作用——哪怕写了 target="_blank",只要 href 是前端路由路径,就不会开新页。
真正生效的只有两类链接:
- 完整 URL(带协议,如
https://api.example.com/data) - 以
/开头的绝对路径,且服务器明确返回 HTML(非 API 响应)
如果想在 SPA 里强制新开页,必须确保 href 是跨域地址,或用 window.open() 手动控制,并记得补 noopener。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!










