button默认type="submit",不写type即触发表单提交;需普通按钮必须显式设type="button";submit支持回车触发且可嵌套富内容,button[type="button"]不支持回车且无富内容能力。

表单提交按钮不是“能点就行”,而是语义、行为、可访问性三者必须对齐。写错一个 type,轻则回车不生效、点击重复提交,重则表单静默失败、无障碍支持崩坏。
button 默认就是 submit,不写 type 就等于埋雷
这是最常被忽略的默认行为:button 在表单内不写 type,浏览器一律按 type="submit" 处理。哪怕你只打算用它触发 JS,只要没显式写 type="button",点一下就会触发表单提交——页面刷新、请求发出、控制台无报错,纯靠网络面板或行为反推。
- Firefox、Chrome、Safari 都遵循该规范,不存在“部分浏览器不同”这种侥幸空间
-
input[type="button"]没这个问题,但它不能嵌套内容,也不支持回车键触发 - 如果同时绑了
onclick和默认提交,又没调e.preventDefault(),大概率发两次请求(JS 提交 + 原生提交)
回车键只认第一个 type="submit",不是所有按钮都响应
用户在任意 input 或 textarea 里按回车,浏览器只会找表单里 DOM 顺序第一个 type="submit" 的控件(button[type="submit"] 或 input[type="submit"])来触发提交。其他按钮,包括 button[type="button"],完全不参与这个机制。
- 想让回车走特定逻辑(比如搜索框回车搜、登录框回车登),必须确保那个逻辑绑定在第一个
type="submit"上 - 如果用了多个提交按钮(如“保存草稿”和“正式提交”),回车永远只触发第一个,不能靠
name或value切换目标 - 手动监听
keydown并判断 Enter 再调form.submit()是可行方案,但属于兜底,不是替代原生机制
button 支持富内容,input[type="submit"] 只能靠 value
button 是容器元素,input 是自闭合标签。这意味着前者能放图标、SVG、<strong></strong>、换行、甚至带 aria-label 的 tooltip;后者所有显示内容全靠 value 属性字符串,样式扩展能力极弱。
-
<button type="submit"><svg></svg>上传</button>合法且可读性强 - 等效的
input写法只能是<input type="submit" value="上传">,加图标得靠 CSSbackground,屏幕阅读器无法识别图标的语义 - 若需支持键盘聚焦+空格/Enter 触发,
button原生支持,input[type="submit"]也支持,但input[type="button"]不支持
FormData 不收集 button 元素,除非它是 submit 且有 name
button[type="button"] 和 input[type="button"] 在序列化时完全不会出现在 FormData、serialize() 或 query string 中——它们只是触发器,不是数据源。只有 button[type="submit"] 或 input[type="submit"] 在带 name 属性时,才会把它的 value(或 innerText)作为键值对一并提交。
- IE 会把
button[type="submit"]的文本内容当value,现代浏览器以value属性为准,建议始终显式设value - 多个
type="submit"按钮共存时,只有被点击的那个才会把name=value发出去,这点可用于区分操作意图(如name="action" value="save"vsvalue="publish") - 禁用状态(
disabled)下,无论什么 type,都不会参与提交,这点和普通表单控件一致
真正容易被忽略的不是怎么写,而是“为什么这个按钮点了没反应”——往往卡在 form 标签缺失、name 属性漏写、或者 type 被默认值悄悄接管。调试时先看网络面板有没有请求发出,再查按钮是否真在 form 内部,最后确认 type 值是否符合预期。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











