仅接受YYYY-MM-DD格式,非法值被静默忽略;需用JS监听input/change事件,通过Date对象比对min/max校验业务规则,并服务端二次验证。

本身不会接受任何特殊字符——它只认 YYYY-MM-DD 格式字符串,其他输入(如 2026/10/20、2026-10-20T12:00、abc、2026-10-xx)会被浏览器静默忽略或清空,value 保持为空或上一个合法值。
所以你真正要防的不是“特殊字符”,而是非法日期格式、超范围日期、手动输入绕过 min/max 的值。
的 value 只能是标准日期字符串
- 合法值示例:
"2026-10-20" - 非法值(会被丢弃):
"2026/10/20"、"2026-10-20Z"、"2026-10-20T00:00"、"2026-10-xx"、"abc" - 浏览器不报错,也不触发
input事件,value 直接不变或变为空字符串
这意味着:
- 你不需要用
oninput+replace()过滤特殊字符(那对type="date"没效果) - 你也不能靠
pattern属性校验它(pattern对type="date"完全无效)
真正需要拦截的是“合法格式但语义非法”的输入
比如:
- 用户手动输入
"2030-12-31",但业务要求最多选到"2026-12-31" - 用户粘贴了
"2026-10-20",但它早于min值 -
min/max已设,但用户在 Safari 或移动端仍能通过键盘输进超限值
这时必须靠 JS 实时校验:
- 监听
input和change事件 - 解析 value 为 Date 对象,再与
min/max对比(注意:直接字符串比较在跨月/年时不可靠) - 非法时立即重置 value,并可选调用
setCustomValidity()
const dateInput = document.querySelector('input[type="date"]');
dateInput.addEventListener('input', () => {
if (!dateInput.value) return;
const selected = new Date(dateInput.value);
const minDate = dateInput.min ? new Date(dateInput.min) : null;
const maxDate = dateInput.max ? new Date(dateInput.max) : null;
<p>if (minDate && selected maxDate) {
dateInput.value = '';
dateInput.setCustomValidity('不能晚于最大日期');
} else {
dateInput.setCustomValidity('');
}
});</p>
最容易被忽略的坑
-
min/max必须是严格"YYYY-MM-DD"字符串,少补零(如"2026-5-20")就失效 - 动态设置时,用
setAttribute('min', '2026-10-20')比input.min = '2026-10-20'更可靠(尤其在 Safari) - 如果用户已输入超限值,浏览器不会自动清空,必须手动判断并赋空
- 所有前端限制都可被禁用 JS 或抓包绕过,服务端必须用相同逻辑二次校验日期范围
别指望 type="date" 自己拦住什么——它只拦格式,不拦业务规则。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











