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

formaction 不是“高级技巧”,它是 HTML 原生支持的、零 JS 的路由分发机制——只要按钮类型对、位置对、路径对,点击就走指定后端地址,不绕弯、不降级失败。
为什么 formaction 点了没反应?先查 type 和位置
浏览器根本不读 formaction,除非它认出这是个“真提交按钮”。常见失效场景全是语义问题:
-
—— 没写type,默认是type="button",formaction被静默忽略 -
—— 明确声明不提交,属性再全也没用 -
——type="button"不触发表单提交,formaction无效 - 按钮在
外部,又没写form="myform"绑定表单 ID —— 浏览器找不到归属表单,属性不生效
formaction + formmethod 必须配对,否则 405 是常态
formaction 只改地址,不改请求方法。如果表单默认是 GET,而你指向一个只接受 POST 的接口(比如 /api/submit),浏览器照发 GET,后端直接返回 405 Method Not Allowed。
- 显式加
formmethod="post":适用于“发布”“保存”等有副作用操作 - 显式加
formmethod="get":适合“预览”“搜索”“导出”,参数拼 URL,可书签化 - 别依赖表单默认 method:没写
method的默认是GET,容易踩坑
相对路径怎么写才不 404?优先用 ./ 开头
formaction 值解析遵循浏览器 URL 解析规则,不是“相对于当前 HTML 文件”,而是“相对于当前页面 URL”。写错路径,请求发到不存在的地址,后端连日志都收不到。
开箱即用的技能链路由引擎。13 条预定义链覆盖搜索、开发、审查、MLOps、法律、创意等场景,三层路由架构(触发词→SAD反馈→DAG编排),recall@10=96.97%。配置驱动(chains.yaml),零代码扩展。pip install skill-weave-chains 一键安装。
-
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 都得独立检查,漏一个就崩一个路径。










