重置后不恢复初始值是因为reset依赖defaultvalue而非value属性;需在dom加载后手动同步defaultvalue,或监听reset事件手动赋值,并确保value符合hh:mm格式。

HTML <input type="time"> 重置后不恢复初始值的原因
表单重置(form.reset() 或点击 <input type="reset">)时,<input type="time"> 不会回到 value 属性设定的初始值,而是清空或回退到浏览器默认的“未设置”状态(显示为空或 --:--)。这是因为该控件的初始值仅在首次渲染时被读取,后续 reset() 行为依赖的是元素的 defaultValue 属性 —— 而它不会自动同步你写的 value 属性。
手动同步 defaultValue 是最直接有效的解法
必须在 DOM 加载完成后,显式把 value 属性的值赋给 defaultValue,否则重置逻辑找不到“初始值”依据:
<input type="time" id="meeting-time" value="09:30"><script>
const timeInput = document.getElementById('meeting-time');
// 关键:重置依赖 defaultValue,不是 value 属性
timeInput.defaultValue = timeInput.value || '00:00';
</script>
- 如果
value属性为空字符串,defaultValue设为'00:00'或其他合理兜底值,避免重置后显示异常 - 务必在
DOMContentLoaded后执行,否则可能取不到value属性值 - 动态插入的
<input>需在插入后立即设置defaultValue
用 JavaScript 拦截 reset 并手动还原更可控
当表单有多个时间输入、或需要兼容旧版 Safari(不完全支持 type="time" 的 reset 行为)时,监听 reset 事件并手动赋值更可靠:
<script> const form = document.getElementById('myForm'); const inputs = form.querySelectorAll('input[type="time"]');</script>
// 记录初始值(可放在 data-* 属性或 Map 中) const initialValues = new Map(); inputs.forEach(el => { initialValues.set(el.name, el.value || '00:00'); });
form.addEventListener('reset', e => { inputs.forEach(el => { el.value = initialValues.get(el.name); }); });
- 这种方式绕过浏览器 reset 实现差异,行为完全由你控制
- 适合需要“部分重置”或“重置前校验”的场景
- 注意:不要在事件中调用
e.preventDefault(),否则原生 reset 功能(如清空文本框)也会失效
Chrome/Firefox/Safari 的兼容性细节不能忽略
不同浏览器对 <input type="time"> 的 reset() 处理并不一致:
- Chrome 和 Firefox:若
defaultValue未设,重置后显示为空,但el.value可能仍为上次输入值(DOM 状态滞后) - Safari(尤其 iOS):重置后可能显示
--:--,且无法通过defaultValue完全修复,必须用reset事件手动赋值 - 所有浏览器:如果
value属性写的是非法格式(如"9:30"缺少前导零),defaultValue会被设为空字符串,导致重置异常
所以,检查 value 是否符合 HH:MM 格式(24 小时制,两位小时+两位分钟),并在 JS 中做标准化处理,比单纯依赖 HTML 属性更稳妥。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











