不写 type 的 <button> 在 <form> 中默认为 submit;必须显式声明 type="button"/"submit"/"reset";type="reset" 仅恢复 HTML 初始值,不响应 JS 修改。

不写 type 的 <button> 在 <form> 里默认就是 submit,点一下就提交刷新——这不是 bug,是规范行为,必须显式声明。
不写 type 属性时,<button> 在表单里会偷偷提交
只要 <button> 被包在 <form> 标签内,又没写 type,所有现代浏览器(Chrome/Firefox/Safari)都按 type="submit" 处理。IE 虽然历史上默认为 button,但已退出主流支持,无需考虑。
- 常见现象:点击按钮后页面跳转、白屏、控制台无报错,JS 的
onclick根本没执行 - React/Vue 项目中尤其隐蔽:组件渲染后按钮仍在
<form>内,onSubmit拦不住原生提交 - 修复方式很简单:直接加
type="button"(纯交互)、type="submit"(真要提交)、或type="reset"(真要重置)
type="submit" 触发的是 submit 事件,不是 click
type="submit" 的本质是“表单生命周期参与者”,它走的是完整提交链路:收集 name 字段 → 构造请求 → 发送到 action → 页面刷新(除非被 event.preventDefault() 拦住)。而 click 只是它的前置钩子,拦不住提交本身。
- 想阻止提交,必须监听
form的submit事件,而不是按钮的click - 即使
<form>没写action,type="submit"点击仍会刷新页面(W3C 规范行为) -
type="button"完全不触发submit,绑form.addEventListener('submit', ...)也收不到
type="reset" 只还原 HTML 初始值,不是“清空”
type="reset" 的作用非常窄:它只把 <input>、<select>、<textarea> 的 value 或 checked 属性设回 DOM 加载时的值(即标签里写的 value="张三"),不是当前 JS 设置的值,也不是 defaultValue。
文章转信息图。将文章/笔记转化为手机可读的 HTML 信息图,自动匹配视觉风格。触发场景:文章转图、笔记转图、信息图、转小红书图、做张图、可视化这篇文章、文生图。
立即学习“前端免费学习笔记(深入)”;
- 如果
<input value="张三">,用户改成“李四”,点 reset 会回到“张三” - 如果
<input>没写value,初始为空,reset 后就是空字符串 - 用
input.value = "new"、Vue 的v-model、React 的useState改的值,reset完全无视 - 它不会触发
change或input事件,依赖这些事件更新 UI 的逻辑不会响应
非法 type 值会被降级,但行为不可靠
浏览器只认 submit、reset、button 这三个合法值。其他如 type="click"、type=""、type="undefined" 都算非法。
- 在
<form>内:非法值一律当submit处理(可能意外提交) - 在
<form>外:非法值降级为button(静默,不报错) - 框架动态渲染时(比如 React 插入未带
type的<button>),这种降级更难排查 - CSS 推荐用
button[type="submit"]这类属性选择器,权重够、不冲突、IE8+ 全支持
真正容易翻车的,不是记不住三者区别,而是嵌套结构下漏掉 type,或者以为 reset 能清掉 JS 状态——它只认 HTML 初始值,别的都不管。


















