先记住这个答案
required 会让支持约束校验的控件在缺少必要输入时出现 valueMissing。文本框为空不通过;同名单选组没有任何选中项不通过;给某个复选框写 required,要求的是这个复选框被勾选。下拉框还要看当前选项是否提供有效值。它不是“同一屏任意填写一项即可”的通用组规则。
- 文本输入为空会
valueMissing - 同名单选组至少选中一项
- 必填复选框要求该项勾选
- 禁用控件不参与普通约束校验
表单的三个必填问题
注册页需要邮箱、通知方式和协议确认。三个需求虽然都可写 required,但判断条件分别是字符串、单选组与某个复选框的选中状态。
<label>邮箱 <input type="email" name="email" required></label>
<fieldset>
<legend>通知方式</legend>
<label><input type="radio" name="notice" value="sms" required> 短信</label>
<label><input type="radio" name="notice" value="mail"> 邮件</label>
</fieldset>
<label><input type="checkbox" name="agree" required> 同意条款</label>邮箱必须填写且还要满足邮箱类型约束;通知方式一组选一个;协议复选框必须勾选。required 只解决是否缺失,业务上是否允许该邮箱或通知方式仍由其他规则判断。
如果题目变成“兴趣爱好至少选一项”,不要给每个复选框都加 required,那会要求全选。应使用适当的组级自定义校验。
默认值、禁用与只读
下拉框初始已经选中一个非空有效选项,required 可能无需用户操作就通过。若希望用户明确选择,常用空值提示选项配合必填。禁用控件不参与正常约束校验;只读字段也不能当成待用户填写的必填字段。
原生校验能帮助用户及时发现遗漏,但不能作为唯一保护。脚本可以改属性,网络请求也可绕开页面,所以服务端仍要检查必填与格式。
检查必填表单时,把约束拆成三件事:控件类型是否支持 required,它当前是否参与约束校验,以及“有值”对这个类型意味着什么。文本框需要非空;单选按钮按同名组检查是否至少选中一项;复选框的 required 则针对该复选框自身,不会自动变成“这一组选一个”。禁用控件不参与校验,隐藏输入类型也不能靠 required 要求用户填写。服务器始终要重新验证,因为客户端可删除属性或直接发请求。
容易答错的地方
- 给所有复选框写
required表示至少选一项 - 每个必填复选框都要单独勾选。至少选一项需要另外的组级逻辑。
- 只要写了
required就以为必须手动操作 - 控件若已有有效默认值,必填条件可能初始就满足。
面试官还会怎么问?
单选组每项都要写 required 吗?
通常不必;同名组内一项带必填约束就能要求组有选中值,写法应保持清楚一致。
下拉框怎样让用户主动选?
可用空值提示选项作初始选择,再给 <select> 加 required,并检查目标浏览器行为。
required 能替代服务端校验吗?
不能。客户端约束可被绕过,服务端必须重新验证关键字段。
参考资料
示例用于理解所注明的运行环境与边界;延伸学习可结合原文中的更多案例。