required属性仅对具备可编辑性与明确空值语义的表单控件生效:包括text、email、number、tel、url、checkbox(需勾选)、radio(同name组至少一选)、select(需含value=""且未设selected的空选项)、textarea和file;而hidden、button、submit等无效,且必须在内通过原生提交触发校验。

required 属性确实能让浏览器在提交时校验字段是否为空,但它只对特定类型生效、依赖用户交互方式,且无法覆盖所有业务场景。
哪些 input 类型支持 required?
只有具备「可编辑内容」和「明确空值语义」的类型才真正受控:
-
type="text"、type="email"、type="number"、type="tel"、type="url"等文本类输入有效 -
type="checkbox"和type="radio"也支持,但行为不同:checkbox 必须勾选;radio 组中至少一个需被选中(required加在任意一个同name的 radio 上即可) -
type="hidden"、type="button"、type="submit"等不接受用户输入的类型,加了required也无校验效果 -
select和textarea同样支持required,但注意select的空选项必须是value=""且未设selected,否则可能绕过校验
为什么点了提交没弹提示?常见失效原因
不是加了 required 就一定触发原生提示,以下情况会静默跳过:
- 表单没有
method或action,或用了event.preventDefault()却没手动调用checkValidity() - 用户用 JavaScript 清空了值但没触发
input或change事件,浏览器可能未更新内部校验状态 -
input被设为disabled或readonly——required对这两者均无效 - 某些移动端浏览器(如旧版 iOS Safari)对
type="date"或type="number"的空值判定不一致,比如输入框显示为空但实际值是"0"或"1970-01-01"
如何配合 JS 做更可靠的必填控制?
原生 required 是第一道防线,但不能替代逻辑层判断:
- 提交前用
form.checkValidity()主动检查,返回false时可阻止提交并聚焦首个无效字段:form.addEventListener('submit', e => { if (!form.checkValidity()) { e.preventDefault(); form.querySelector(':invalid').focus(); } }); - 对动态渲染的字段,确保
required属性是在 DOM 插入后同步设置的,而不是仅靠 JS 控制 class 或 placeholder - 如果字段需“条件必填”(例如:选了“其他”才要求填备注),不能只靠 HTML 属性,必须用 JS 切换
required属性:el.required = shouldRequire; - 服务端永远要二次校验 ——
required完全可被禁用或绕过,仅前端控制毫无安全性可言
最常被忽略的是:多个同名 radio 中只给一个加 required 就够了;而 select 的占位选项如果带 value="" 又设了 selected,会导致即使用户没选,校验也通过。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











