target="self"错误,必须写成target="_self";前者试图查找名为self的iframe而失败,常意外新开标签页,后者才是规范指定的当前窗口打开方式。

target="self" 是错的,必须写成 target="_self"
直接写 target="self" 不会指向当前窗口,而是试图找一个叫 self 的命名浏览上下文(比如 <iframe name="self">),但这种 iframe 几乎不存在,结果多数浏览器会 fallback 到 _blank 行为——也就是意外新开标签页。
正确写法只有 target="_self",开头必须带下划线。HTML 规范明确限定:所有预定义目标值都以下划线开头,_self、_blank、_parent、_top 都是保留字,不能省略下划线。
-
target="self"→ 错误,等效于指向名为self的 frame,通常失败后行为不可控 -
target="_self"→ 正确,显式声明在当前上下文加载 - 不写
target属性 → 等价于target="_self",默认行为
为什么写了 target="_self" 还新开窗口?
常见原因不是值写错,而是上下文被污染或属性挂错位置:
-
<base target="_blank">在<head>里全局生效,会覆盖所有链接和表单的默认行为,此时单个元素写target="_self"才能抵消 - 把
target="_self"写在<button>或<img>上——无效,它只对<a>和<form>生效 - 表单提交时 JS 调用了
event.preventDefault(),导致原生target完全不触发 - 服务端返回了 HTTP 重定向(302/303),Location 响应头接管跳转,
target被绕过
form 元素上 target="_self" 有什么特别要注意的?
<form target="_self"> 是默认行为,显式写出来通常只为对抗 <base> 或提升可读性。但它只在表单真正提交时起作用:
立即学习“前端免费学习笔记(深入)”;
- 必须用
<button type="submit">或<input type="submit">触发,type="button"不行 -
formtarget="_self"可以写在 submit 按钮上,优先级高于<form>的target - 如果后端返回的是
204 No Content或前端用 fetch 处理响应,页面不会跳转——这不是target失效,而是根本没有导航发生
SPA 场景下 target="_self" 还有用吗?
基本没用。现代单页应用(React/Vue)靠 JavaScript 拦截点击并调用路由方法(如 router.push()),target 属性被完全忽略。即使你写了 <a href="/home" target="_self">,只要被框架的路由系统接管,就不会触发真实导航。
真正起作用的只有纯 HTML 页面、未被 JS 干预的表单提交、或者 target="_blank" 这类无法被拦截的强制新开行为。所以别指望在 Vue 的 v-html 渲染内容里靠 target="_self" 控制跳转——先确认框架是否放行该属性,再看路由是否介入。
容易被忽略的是:iframe 里嵌套页面时,target="_self" 指的是“当前 iframe”,不是最外层窗口;想跳出 iframe,得用 target="_top" 或 target="_parent",且必须确保 iframe 有 name 属性匹配。



















