HTML5表单验证默认开启,需在form标签添加novalidate属性关闭;它跳过所有内置校验但不影响validity对象和CSS伪类,服务端校验仍必需。

HTML5 表单验证默认开启,想关掉?直接加 novalidate 属性就行,但得加对地方——不是加在 input 上,而是加在 form 标签上。
form 标签加 novalidate 才生效
很多人误以为给某个 input 加 required 就得单独关,其实浏览器只认 form 级别的开关。只要 form 有 novalidate,所有内置校验(required、type="email"、pattern 等)全部跳过。
-
novalidate是布尔属性,写成novalidate或novalidate="novalidate"都行,推荐简写 - 它不影响 JavaScript 调用
checkValidity()或reportValidity(),这些 API 仍会返回结果,只是提交时不触发 - 如果表单同时有多个
submit按钮,其中一个带formnovalidate属性,点它也能临时绕过校验(比全局novalidate更细粒度)
禁用后 input 的 validity 对象还在
加了 novalidate 只是跳过提交拦截,DOM 中每个 input 的 validity 属性、:valid/:invalid CSS 伪类依然工作。比如用户输错邮箱,input.validity.typeMismatch 还是 true,样式也可能变红。
- 若连视觉反馈也要关,得手动重置样式,例如用
input:not([required])或 JS 清除classList - 别依赖
form.checkValidity()判断“是否通过 HTML5 校验”,因为它仍会计算——真正要的是“提交时是否被拦”,那取决于有没有novalidate
和服务端校验不是一回事
novalidate 只影响浏览器原生行为,跟后端完全无关。禁用后用户仍可发任意数据,服务端必须保留完整校验逻辑。
立即学习“前端免费学习笔记(深入)”;
- 常见误区:本地关了校验就以为“不用再验了”,结果上线后被恶意空提交或格式错误搞崩接口
- 如果用 JS 自己做提交(如
fetch),记得删掉event.preventDefault()后的校验调用,否则容易重复判断 - 某些 UI 库(如 Bootstrap Vue)会自动绑定校验,此时光加
novalidate不够,还得查文档关掉库内集成逻辑
最易忽略的一点:开发时习惯性用 Chrome DevTools 修改 DOM 加 novalidate,但忘了写进源码——上线后校验照常触发,而你还在奇怪“我明明关了啊”。











