max仅限制UI选择范围而不校验提交值,用户可通过手动输入、粘贴或禁用JS绕过;其值须为YYYY-MM-DD格式字符串,动态设置需用字符串赋值并配合checkValidity();必须前后端双重校验且考虑浏览器兼容性差异。

直接用 max 属性就能限制日期选择器的最大可选日期,但浏览器行为和实际效果常被低估——它只控制 UI 选择范围,不校验提交值,也不阻止手动输入非法日期。
为什么设置了 max 却还能提交超限日期?
max 是纯客户端约束,仅影响原生 <input type="date"> 的日历弹窗和键盘上下键导航。用户仍可通过以下方式绕过:
- 手动在输入框中键入超出范围的日期(如
2030-01-01) - 粘贴非法日期字符串
- 禁用 JavaScript 后直接提交表单
浏览器不会自动拦截或修正这些输入,submit 事件照常触发,后端收到的仍是原始字符串。
max 的取值格式与动态设置要点
必须是 YYYY-MM-DD 格式字符串,且不能含时间部分;任何其他格式(如 YYYY/MM/DD、带时区、空格或字母)会导致属性失效,浏览器忽略该约束。
立即学习“前端免费学习笔记(深入)”;
动态设置时需注意:
- 用 JavaScript 修改时,必须赋值为字符串:
inputElement.max = "2025-12-31",而非Date对象或毫秒数 - 若依赖当前日期计算上限(如“最多选未来90天”),需手动补零:
new Date().toISOString().split("T")[0]或用String.prototype.padStart() - 设置后建议调用
inputElement.checkValidity()触发即时校验反馈
必须搭配的防御性措施
仅靠 max 不足以保障数据合法性,真实项目中至少要补两层:
- 前端 JS 监听
input和change事件,对输入值做正则+范围双重校验,非法时清空或重置为默认值 - 服务端必须重新解析并验证日期是否在允许区间内,不可信任任何前端传来的
date字段 - 如需更严格的 UI 控制(禁用非法输入),应改用第三方库(如 flatpickr)或自定义组件,原生
input[type="date"]无法拦截手动输入
最容易被忽略的是:不同浏览器对 max 的视觉反馈不一致——Safari 可能灰掉超限日期但不阻止输入,Chrome 会禁用日历中的超限项但允许键盘输入。别假设用户只会点日历。



















