button默认type="submit",会触发表单提交;需普通按钮时必须显式设type="button";submit按钮支持回车触发,button[type="button"]不支持;button支持富内容嵌套,input仅靠value显示文本。

button 默认会提交表单,不写 type 就等于 type="submit"
这是最常踩的坑:一个 <button>确定</button> 放在 <form> 里,点一下页面就刷新了,控制台没报错,开发者工具也看不出异常——其实是表单默默提交了。因为 button 的 type 默认值就是 "submit",而 input[type="button"] 默认不会提交,input[type="submit"] 明确会提交。
- 要当普通按钮用,必须显式写
type="button" -
input[type="button"]没有这个风险,但它只能靠value控制文本,不能嵌套<img>或<span> - 如果用
button却忘了设type,又绑了onclick做 JS 提交,很可能触发两次提交(JS 提交 + 默认表单提交)
submit 按钮天然支持回车键,button 不支持
用户在表单任意 input 中按回车,浏览器会自动触发第一个 type="submit" 的控件(input[type="submit"] 或 button[type="submit"])。但 button[type="button"] 或 input[type="button"] 完全不响应回车。
- 需要键盘操作友好性(比如登录框回车提交),必须至少有一个
type="submit"按钮 - 若用
button[type="button"],就得手动监听keydown并判断 Enter 键,再调用form.submit() - 多个 submit 按钮时,回车只触发第一个;想让回车走特定逻辑,得靠 JS 拦截并分发
button 支持富内容,input 只能靠 value 渲染文本
button 是容器元素,里面可以放图标、SVG、文字加粗、换行甚至 tooltip 包裹;input 是自闭合标签,所有显示内容都来自 value 属性,没法加样式节点。
- 例如:
<button type="button"><svg>...</svg><span>导出</span></button>合法且常见 - 等价的
input写法只能是<input type="button" value="导出">,图标得靠 CSS background 实现,可访问性差 - 屏幕阅读器对
button的内容更友好,尤其含aria-label或图文混合时
两者在 FormData 和序列化中都不上传,除非 type 是 submit
无论是 button[type="button"] 还是 input[type="button"],只要 type 不是 "submit" 或 "image",它们都不会出现在 FormData、serialize() 或原生表单提交的 query string 里——这点和 disabled 控件一致。
立即学习“前端免费学习笔记(深入)”;
-
button[type="submit"]和input[type="submit"]本身也不会被提交,但它们触发的提交行为会让其他表单控件数据发出去 - 如果给
button加了name和value,且type="submit",那它的value会作为键值对参与提交(IE 甚至会把 innerText 当 value) - 想让按钮“带参提交”,比如区分“保存”和“保存并退出”,用
button[type="submit"]更直接,不用额外 JS 操作 hidden input
button 和 input[type="submit"] 的取舍基本就定了。



















