required属性失效是因为首个option的value非空;正确做法是设value=""、disabled且selected,使初始选中空值并禁用交互,确保校验触发。

required 属性失效是因为第一个 <option> 的 value 不为空
HTML 中 <select required> 的校验逻辑很朴素:只要当前选中的 <option> 的 value 是空字符串(""),就认为未选择。如果首个 <option> 写了 value="请选择" 或 value="0",哪怕它只是个占位提示项,浏览器也会把它当作一个“合法选项”,导致 required 无法触发校验。
常见错误写法:
<select required> <option value="请选择">-- 请选择 --</option> <option value="1">苹果</option> <option value="2">香蕉</option> </select>
此时用户没做任何操作,表单也能提交成功——因为默认选中了第一个 <option>,而它的 value 是 "请选择",非空。
正确设置占位 option 的 value 和 disabled selected
让 required 生效,必须满足两个条件:首个 <option> 既不能被选中(作为有效值),又必须是空值。推荐做法是:
立即学习“前端免费学习笔记(深入)”;
-
value留空:value="" - 加上
disabled:防止用户手动选中它 - 加上
selected:确保它初始被选中(此时value=""触发required校验)
正确示例:
<select required> <option value="" disabled selected>-- 请选择 --</option> <option value="1">苹果</option> <option value="2">香蕉</option> </select>
注意:disabled 是关键。只写 value="" 不够——用户仍可点开下拉并选中它,而一旦被选中,哪怕 value="",也算“已选择”,required 就不会报错;disabled 让它不可交互,同时浏览器在表单校验时会忽略 disabled 的 <option>,只看是否还有其他可选且非空的项被选中。
用 JavaScript 检查当前选中值是否触发 required
调试时别只看 HTML 结构,要验证实际 DOM 行为。可在控制台运行:
const sel = document.querySelector('select[required]');
console.log('当前 value:', sel.value); // 应为 "" 才能触发 required
console.log('当前 selectedIndex:', sel.selectedIndex); // 应为 0(指向 disabled 占位项)
console.log('对应 option 的 value:', sel.options[sel.selectedIndex].value); // 应为 ""如果 sel.value 不是空字符串,说明要么首个 <option> 的 value 被设了值,要么有 JS 动态设置了 sel.value 或 sel.selectedIndex,覆盖了初始状态。
另外注意:某些 UI 库(如 Select2、Element UI)会隐藏原生 <select>,用自定义 DOM 替代。此时原生 required 完全不生效,必须依赖库自身的校验机制。
移动端 Safari 和旧版 Android 浏览器的兼容性坑
部分老版本 Safari(iOS 12 及更早)对 disabled selected 占位项支持不稳定:可能不显示占位文字,或点击后直接跳过它选中第二项。稳妥方案是:
- 保留
value="" disabled selected作为基础校验保障 - 额外加一层 JS 校验:
submit事件中检查select.value === "" - 避免依赖
:invalidCSS 伪类做视觉提示,改用 JS 添加 class 控制样式
Android WebView(尤其 Chrome 53 之前)也有类似问题:即使 <option disabled selected> 存在,首次点击下拉时可能自动高亮第二项,造成“看似已选中”的假象。这种情况下,仅靠 HTML 层面的 required 不可靠。
最常被忽略的一点:required 只校验 value 是否为空字符串,和 textContent、label、是否带星号都无关。盯着第一个 <option> 的 value 值看,比检查 CSS 或 JS 更快定位问题。



















