formaction 是 HTML 原生零 JS 路由机制,需 button type="submit" 且在 form 内或绑定 form 属性;须配对 formmethod 防 405;路径推荐 ./ 开头;可加 formnovalidate 跳过验证。

formaction 不是“高级技巧”,它是 HTML 原生支持的、零 JS 的路由分发机制——只要按钮类型对、位置对、路径对,点击就走指定后端地址,不绕弯、不降级失败。
为什么 formaction 点了没反应?先查 type 和位置
浏览器根本不读 formaction,除非它认出这是个“真提交按钮”。常见失效场景全是语义问题:
-
<button>保存</button>—— 没写type,默认是type="button",formaction被静默忽略 -
<button type="button" formaction="/save">保存</button>—— 明确声明不提交,属性再全也没用 -
<input type="button" formaction="/publish">——type="button"不触发表单提交,formaction无效 - 按钮在
<form>外部,又没写form="myform"绑定表单 ID —— 浏览器找不到归属表单,属性不生效
formaction + formmethod 必须配对,否则 405 是常态
formaction 只改地址,不改请求方法。如果表单默认是 GET,而你指向一个只接受 POST 的接口(比如 /api/submit),浏览器照发 GET,后端直接返回 405 Method Not Allowed。
当代理已经知道网站路由或内容URL,并且在启动前需要有效的sitemap XML、sitemap索引或robots.txt引用时,请使用sitemap。这是一个发布构件技能,而不是爬虫或SEO平台。
- 显式加
formmethod="post":适用于“发布”“保存”等有副作用操作 - 显式加
formmethod="get":适合“预览”“搜索”“导出”,参数拼 URL,可书签化 - 别依赖表单默认 method:没写
method的<form>默认是GET,容易踩坑
相对路径怎么写才不 404?优先用 ./ 开头
formaction 值解析遵循浏览器 URL 解析规则,不是“相对于当前 HTML 文件”,而是“相对于当前页面 URL”。写错路径,请求发到不存在的地址,后端连日志都收不到。
-
formaction="api/save"→ 解析为https://site.com/current/path/api/save(易受当前 URL 路径深度影响) -
formaction="./api/save"→ 明确相对于当前目录,稳定可靠,推荐 -
formaction="/api/save"→ 从域名根开始,需确保 Nginx/Apache 代理配置匹配 -
formaction=""或空值 → 提交到当前完整 URL(含 query string 和 hash),极少有用
能“只提交部分字段”吗?不能,但可以绕过验证
所有 name 字段都会按标准序列化提交,formaction 不改变这一行为。想实现“草稿不校验邮箱”,不能靠隐藏字段,得用原生机制:
- 给“暂存”按钮加
formnovalidate:跳过 HTML5 内置验证(如required、type="email") - 后端必须做字段级判断:接收全部字段,但对“草稿”请求只存
title和content,忽略未填的email - 别试图用 JS 动态
remove()字段:破坏表单语义,禁 JS 时失效,且可能触发意外验证
真正容易被忽略的是:formaction 的作用域仅限于“本次点击”,它不污染表单状态,也不影响其他按钮——但正因如此,每个按钮的 formaction、formmethod、formenctype 都得独立检查,漏一个就崩一个路径。


















