form.reset() 仅恢复 html 初始 attribute 值,非 js 修改值或业务默认态;需手动设 defaultvalue/defaultchecked/selectedindex 等属性才能精准控制重置行为。

form.reset() 只会把表单控件恢复到 HTML 加载时的初始 attribute 值,不是你 JS 改过的值,也不是你想要的“空”或“默认业务状态”。真要可靠重置,得自己动手存快照、手动赋值。
为什么 type="reset" 按钮点了没反应或行为异常
它根本不是“失效”,而是严格按规范执行:只作用于 name 存在、未 disabled 的原生控件(input、select、textarea),且只读取 HTML 中写的 value、checked、selected 属性。
-
<input name="email">→ 初始值是空字符串,重置后就是空 -
<input name="city" value="北京">→ 重置后永远显示“北京”,不是空 -
<input name="token" disabled>→ 不参与重置,值不变 -
<button>重置</button>→ 默认是type="submit",点一下就提交,不是重置
如何让 form.reset() 真正按你预期工作
关键不是阻止它,而是提前把“你定义的初始状态”写进 DOM 的 default* 属性里。这样 reset() 就能读到你想要的值。
- 对文本类控件(
text、email、number等):设el.defaultValue = '初始值' - 对 checkbox / radio:设
el.defaultChecked = true/false - 对
select单选:设el.selectedIndex = 0或对应索引;多选需遍历el.options设defaultSelected - 别在页面加载后用
el.value = 'xxx'覆盖初始值再指望 reset 回来——它不认这个
手动重置比依赖原生 reset 更可控的场景
当你需要“清空”而非“还原”,或表单含自定义组件(如日期选择器、标签输入框)、动态字段、file 输入时,form.reset() 就不够用了。
-
input[type="file"]:浏览器禁止 JS 读取文件内容,但reset()也不清空已选文件名,必须手动el.value = '' - 第三方组件(如 Element Plus 的
el-date-picker):调它的resetFields()方法,不是操作 DOM - 局部重置:只清几个字段?直接
document.getElementById('field1').value = '',别绕路 - disabled/readonly 字段:它们会被
reset()影响(readonly会恢复初始值,disabled不写回但属性还在),但用户不可改——你要不要重置它们,得看业务逻辑
最容易被忽略的细节
setTimeout(() => { /* 恢复逻辑 */ }, 0) 不是玄学。因为 reset 事件触发时,DOM 还没完成更新,直接读 el.value 会拿到旧值;延迟执行才能确保你覆盖的是浏览器刚写进去的“初始值”结果。另外,FormData(form) 不能用来判断重置后状态——它跳过 disabled、无 name、type="hidden" 字段,也反映不了 checked 变化。真实状态只能查 el.value、el.checked、el.selectedIndex。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











