form 的 action 属性决定表单提交的目标地址,浏览器直接向该地址发送请求并用响应替换当前页;空字符串提交至当前URL,绝对路径从根目录解析,相对路径基于当前页面目录,跨域需CORS支持;target仅控制响应展示位置,不影响提交地址;JS调用submit()前必须显式设置action;服务端302重定向可覆盖action目标,最终跳转由后端Location头决定。

form 的 action 属性决定提交后跳转到哪
表单提交后跳转的目标页,完全由 标签的 action 属性控制。它不是“提交后额外跳转”,而是原生提交行为的一部分——浏览器会向该地址发送请求,并用响应内容替换当前页面(或按 target 指定方式打开)。
常见错误是误以为提交后还要手动写 JS 跳转,或者把 action 写成相对路径却没注意当前 URL 上下文,导致 404。
-
action值为空字符串(action=""):提交到当前 URL,适合同页面处理(如 PHP 的$_SERVER['PHP_SELF']场景) -
action="/login":绝对路径,从根目录开始解析,与当前页面位置无关 -
action="success.html":相对路径,基于当前页面所在目录解析(比如当前页是/admin/user/edit.html,则实际提交到/admin/user/success.html) -
action="https://api.example.com/submit":跨域提交,需服务端配置 CORS 或使用 POST-redirect-GET 模式避免前端报错
用 target 控制打开方式,但不改变跳转目标
target 只影响“在哪里打开响应结果”,不影响提交发往哪个地址。它和 action 是协作关系,不是替代关系。
-
target="_self"(默认):在当前 tab 刷新显示响应内容 -
target="_blank":新开 tab,提交后原页面不变,新 tab 显示响应(注意:部分浏览器会拦截无用户交互触发的弹窗) -
target="myFrame":提交结果载入指定,适合无刷新局部更新 - 慎用
target="_parent或_top:嵌套 iframe 场景才需要,普通页面用了可能意外跳出框架
JavaScript 干预时,action 仍要设对,否则 submit() 不生效
如果用 JS 拦截表单并调用 form.submit(),action 必须提前设好。JS 不会自动补全或推断目标地址。
立即学习“前端免费学习笔记(深入)”;
典型错误写法:
正确做法是显式设置:
- 提交前赋值:
form.action = '/api/v1/register'; form.submit(); - 或直接用
fetch+ 阻止默认行为,此时action可不设,但那就不是“表单原生提交”了 - 若用
fetch后想跳转,得手动window.location.href = '/success',这和action无关
服务端返回 302 重定向时,action 地址只是起点
表单提交后的最终页面,不一定就是 action 指向的地址。如果服务端返回 HTTP 302(或 303、307)状态码并带 Location 头,浏览器会自动跳转到那个地址。
这意味着:
-
action="/submit"提交后,服务端可返回Location: /thank-you,用户最终看到的是/thank-you - 这种跳转对前端透明,不需要 JS 参与,也无需修改表单属性
- 调试时注意看 Network 面板里的重定向链,别只盯着初始请求的
action值判断最终去向 - POST 表单重定向后,浏览器地址栏变成 GET 地址,刷新安全(即不会重复提交)——这是推荐的 POST-redirect-GET 模式
真正容易被忽略的是:前端开发者常盯着 HTML 里的 action 找跳转逻辑,却忘了服务端才是最终路由决策者。尤其在前后端分离项目中,action 可能指向一个代理接口,而真实跳转由后端根据业务结果动态决定。











