validitystate 是浏览器在原生表单控件(如 )上自动暴露的只读属性,通过 element.validity 访问,反映实时验证状态;它不可手动创建,不触发验证,仅提供当前合法性信息。

ValidityState 是什么,它在哪能用
ValidityState 不是一个可手动创建的对象,而是浏览器在表单控件(如 <input>、<select></select>、<textarea></textarea>)上自动暴露的只读属性,通过 element.validity 访问。它反映当前元素的实时验证状态,比如是否为空、格式是否合法、是否超出范围等。
它只在原生表单控件上存在,自定义组件(如 React 封装的输入框)默认没有这个属性——除非你手动透传或模拟。注意:它不触发验证,也不提交表单,只是“告诉你现在是不是合法”。
常见 validity 属性及对应触发条件
调用 inputElement.validity 返回一个对象,里面一堆布尔值。关键字段有:
-
valid:所有验证都通过才为true;只要任一其他字段为true(即存在错误),它就是false -
valueMissing:必填(required)但值为空字符串或未选中 -
typeMismatch:类型不匹配,比如type="email"但输入了foo;type="url"但没写http:// -
patternMismatch:pattern正则不匹配(注意:空值不会触发此项,除非同时设了required) -
tooLong/tooShort:超出maxlength或低于minlength -
rangeOverflow/rangeUnderflow:数值或日期超出max/min -
stepMismatch:比如type="number" step="0.5",却输入了1.2 -
badInput:用户输入了根本无法解析的值,比如type="number"里输abc
这些字段互斥性不强——一个输入可能同时触发 valueMissing 和 typeMismatch,但实际中浏览器通常只激活最“优先”的一项(例如空值时优先报 valueMissing,而非 typeMismatch)。
如何安全读取 validity 并避免误判
直接读 input.validity.valid 看似简单,但容易踩坑:表单刚加载时,哪怕输入框是空的且 required,validity.valid 也可能是 true——因为浏览器默认不主动验证未交互过的字段。
所以真实场景中必须配合用户行为或显式验证:
文章转信息图。将文章/笔记转化为手机可读的 HTML 信息图,自动匹配视觉风格。触发场景:文章转图、笔记转图、信息图、转小红书图、做张图、可视化这篇文章、文生图。
- 监听
input或blur事件再查validity,比监听change更及时(change在失焦后才触发) - 调用
input.checkValidity()会强制触发验证逻辑,并返回布尔结果,同时让validity属性更新为最新状态 - 不要仅靠
validity.valid === false判定错误——要具体看哪个字段为true,否则无法给出准确提示(比如把tooShort错当成typeMismatch) -
validity对disabled元素始终返回全false(包括valid: true),即使它本应不合法
示例:
const input = document.querySelector('input[required]');
input.addEventListener('blur', () => {
if (!input.checkValidity()) {
const { valueMissing, tooShort, patternMismatch } = input.validity;
if (valueMissing) console.log('不能为空');
else if (tooShort) console.log(`至少 ${input.minLength} 个字符`);
else if (patternMismatch) console.log('格式不对');
}
});
兼容性与 polyfill 的现实限制
ValidityState 在现代浏览器中支持良好(Chrome 10+、Firefox 4+、Safari 5.1+、Edge 12+),但 IE 完全不支持——input.validity 会是 undefined。
没有靠谱的 polyfill 能完整还原 ValidityState 行为,因为它的底层依赖浏览器内置的解析与校验引擎(比如 email 格式规则、step 计算逻辑)。强行模拟容易漏 case 或跟标准不一致。
如果必须兼容 IE,建议:
- 降级为手动正则 + 属性检查(如自己读
required、pattern、minlength) - 放弃对
type="email"等语义化类型的依赖,统一用type="text"+ 自定义校验 - 避免依赖
badInput或stepMismatch这类高度依赖渲染引擎的字段
真正难处理的不是属性读取,而是不同浏览器对同一规则的解释差异——比如 Safari 对 type="url" 的宽松判断,或 Chrome 对空格截断的处理。这些细节往往比兼容性更影响体验。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!










