input[type="date"]加required仅校验是否选日期(value为""时触发),不校验格式合法性、min/max范围;失效常见于无form包裹、type="button"提交、e.preventdefault()未手动校验、旧版safari兼容问题及js误设默认值。

input[type="date"]加required就能生效,但只校验是否选了日期
直接在 input 标签上写 required 属性即可,浏览器会在提交时检查 value 是否为空字符串 ""。它不验证日期格式是否合法(比如 "2024-02-30" 也能过),也不管是不是未来日期或超出 min/max 范围。
为什么点了提交却没拦住?常见触发失败场景
原生校验不是“写了就起作用”,它依赖特定交互路径:
- 表单必须包裹在
<form></form>中,且不能带novalidate属性 - 必须用
<button type="submit"></button>或回车触发提交;<button type="button"></button>或 JS 直接调form.submit()完全跳过校验 - 如果在
submit事件里写了e.preventDefault(),必须手动调form.checkValidity()或form.reportValidity() - 旧版 iOS Safari(≤15.4)对
type="date"的required支持不稳定,可能静默通过
select 和 date 混用时的空值陷阱
select 必须配一个 <option value="">请选择</option>,且不能加 selected;否则用户没动下拉框,浏览器会默认选中这个空项,required 就被绕过了。而 input[type="date"] 不同:只要没点选,value 就是 "",required 立刻生效——但要注意,某些框架或 JS 初始化时强行设了默认值(比如 value="1970-01-01"),那 required 就永远不报错。
服务端必须二次校验空值,不能信前端
用户可以禁用 JS、删掉 required 属性、用 curl 直接发请求,或者填个空格字符串 " " —— 这些都逃得过前端校验。后端收到的数据,必须显式判断:value === null、value === ""、value.trim() === "" 都算缺失。尤其注意:数据库字段设了 NOT NULL 不等于能挡住空字符串,那是另一层约束。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











