valuemissing 为 true 仅当元素支持 required、明确声明 required 属性且 input.value 严格等于 "";需先检查 input.validity 存在性,避免兼容问题,不可用 checkvalidity() 替代判断,注意空格、null 赋值及 select 默认选项等误判场景。

直接读取 input.validity.valueMissing 就能判断该字段是否属于「必填但未填」——它只在元素有 required 属性且当前 value 为空字符串("")时返回 true,其余情况为 false。这是定位漏填错误最精准、最轻量的方式。
什么时候 valueMissing 会是 true
必须同时满足三个条件:
- 元素是支持 required 的类型:
<input>(非hidden/button等)、<select></select>或<textarea></textarea> - 标签上明确写了
required属性(哪怕 JS 动态加上也生效) - 当前 DOM 的
value属性值严格等于空字符串:input.value === "";注意:" "(空格)不算,placeholder内容也不算
怎么安全地读取和使用它
不要直接访问 input.validity,先做存在性检查,尤其要兼容老环境:
-
if (input.validity && input.validity.valueMissing)—— 防 IE 和旧安卓 WebView 返回空对象 - 别用
input.checkValidity()单独判断漏填,它返回的是整体 valid 状态,无法区分是没填还是格式错 - 想手动触发提示并聚焦,调
input.reportValidity(),它会弹气泡、加红框,并返回布尔值,内部自动检查包括valueMissing
常见误判场景和避坑点
以下情况看似“空”,但 valueMissing 仍为 false:
-
<select required><option value="">请选择</option></select>:默认选中空值,value是"",但没加disabled,浏览器认为用户“已选择”,不触发valueMissing;应改为<option value="" disabled selected></option> -
<input required value=" ">:value 是空格字符串,不是空,valueMissing为false - 用 JS 清空后又设了
input.value = null:DOM 中value会被转成"null"字符串,不再是空,valueMissing不生效
结合表单提交做统一处理
监听 submit 事件时,不要只靠 event.preventDefault() 拦截后自己遍历判断。更稳妥的做法是:
- 先调
form.checkValidity()快速过一遍原生校验 - 若返回
false,再遍历所有required字段,逐个查input.validity && input.validity.valueMissing - 找到第一个为
true的字段,input.focus()并滚动到可视区域(input.scrollIntoView({block: 'center'}))











