根本原因是浏览器将视作已选中有效值,导致required校验通过;必须同时添加disabled和selected属性,且其他选项value需为非空字符串。

select required 为什么首项 value="" 却不报错
根本原因:浏览器把 <option value=""></option> 当作“已选中有效值”,哪怕它只是个提示占位符。只要这个空值 option 没被禁用,required 就认为用户已经填了——校验直接通过。
常见现象是表单点提交没反应、控制台无报错、页面静默跳转,实际后端收到空字符串 ""。
- 不要只写
<option value="">请选择</option>,必须加disabled和selected -
disabled让它不可提交,selected让它默认显示,两者缺一不可 - 其他可选项的
value必须是非空字符串(如"active"、"1"),否则仍可能绕过
正确的 select required 写法示例
以下代码才能真正触发拦截:
<select name="role" required><option value="" disabled selected>-- 请选择角色 --</option> <option value="admin">管理员</option> <option value="user">普通用户</option></select>
关键点:
将调研报告、方案对比、数据分析、需求梳理、会议纪要、设计说明、代码评审、学习笔记等任务产物输出为可在浏览器直接打开的单文件 HTML,替代 Markdown 作为最终交付物。Markdown 在信息密度、视觉清晰度和可分享性上已跟不上 AI 产物的丰富度,HTML 能同时承载排版、表格、SVG 等。
-
disabled是核心——它让该选项不参与表单数据提交 -
selected确保加载时默认聚焦在提示项,用户必须手动切换才有效 - 如果去掉
disabled,哪怕加了required,选中第一项照样提交成功
submit 事件里 preventDefault 后 required 失效怎么办
你写了 e.preventDefault(),但没调 form.checkValidity(),等于主动关掉了浏览器校验。此时 select 的 required 完全不生效。
- 监听
submit时,先调form.checkValidity()判断是否通过 - 返回
false时,浏览器会自动聚焦第一个失败项并弹提示,无需额外处理 - 返回
true才执行你的后续逻辑(如发请求) - 别用
<button onclick="handleSubmit()"></button>,必须设type="submit",否则连submit事件都不触发
reportValidity() 在 select 上的兼容性坑
想手动触发校验(比如失焦时),调 select.reportValidity() 看似合理,但在 Firefox 中它对空 value 的判定比 Chrome 更严格——即使你写了 disabled selected,Firefox 可能仍报错。
- 稳妥做法:只在
submit事件里依赖原生行为,避免手动调reportValidity() - 若必须手动校验,改用
form.checkValidity()+ 遍历form.elements查validity.valueMissing - 注意 iOS Safari 旧版本对
select[required]支持不稳定,加disabled selected是唯一可靠解法
真正容易被忽略的是:disabled 不是可选项,是必选项。少了它,required 在 select 上就形同虚设。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!










