input type="date" 重置后变空是因为其仅认 HTML 的 value 属性或 JS 设置的 defaultValue,而非当前 value;需用 defaultValue 同步日期(格式 YYYY-MM-DD),或手动重置跳过日期字段,PHP 回填时须严格格式化为 YYYY-MM-DD。

为什么 input type="date" 重置后总变空
因为浏览器对 input type="date" 的重置行为严格遵循 HTML 初始 value 属性值——不是你 JS 设置的当前值,也不是用户选中的日期。如果 HTML 里没写 value(比如 <input type="date">),初始值就是空字符串,form.reset() 或 <button type="reset"></button> 一按,它必然清空。
用 defaultValue 同步日期值再 reset
这是最轻量、兼容性最好的原生方案,核心是让重置逻辑“认得”你想要的默认日期。
- 页面加载后立刻设置:
dateInput.defaultValue = dateInput.value || '2026-10-20'(注意格式必须是YYYY-MM-DD) - 后续可任意修改
dateInput.value,不影响重置目标 - 调用
form.reset()时,该输入框会回到defaultValue所设的日期 - 不适用于 layui 渲染的日期控件(如
lay-date),只对原生input[type=date]有效
手动重置 + 显式跳过日期字段
当表单混用原生控件和第三方组件(如 Element UI、Ant Design 的日期选择器),或需要保留多个字段时,绕过原生 reset() 更可靠。
- 给日期输入框加标记:
<input type="date" id="orderDate" data-preserve="date"> - 遍历所有可重置字段:
form.querySelectorAll('input:not([data-preserve]), select:not([data-preserve]), textarea:not([data-preserve])') - 对每个匹配元素分别处理:
el.value = ''(text/number/date)、el.selectedIndex = 0(select)、el.checked = false(checkbox/radio) - 日期字段完全不动,或显式恢复:
dateEl.value = savedDateValue - 最后调用
layui.form.render()(如有 layui 渲染的下拉/开关)
PHP 提交后回填日期要特别注意格式
服务端回传的日期值若格式不对,浏览器直接忽略,显示为空。PHP 中必须确保输出为标准 YYYY-MM-DD:
立即学习“前端免费学习笔记(深入)”;
<input type="date" name="due_date" value="<?php echo isset($_REQUEST['due_date']) ? htmlspecialchars(date('Y-m-d', strtotime($_REQUEST['due_date']))) : ''; ?>">
关键点:strtotime() 转时间戳 + date('Y-m-d') 格式化,不能直接 echo 原始字符串;htmlspecialchars() 防止 XSS 和属性截断。
真正容易被忽略的是:日期输入框的重置行为和文本框不同——它不响应 defaultChecked 或 defaultSelected,只认 defaultValue;且一旦 JS 修改了 value 却没同步 defaultValue,重置就彻底失效。别指望一次 setAttribute 能搞定,得在每次业务赋值后主动维护这个映射。



















