novalidate 属性可完全关闭表单的HTML5内置验证,只需在标签中添加该布尔属性即可,无需赋值;它仅作用于当前表单,不影响submit事件和checkValidity()等API调用。

怎么用 novalidate 完全关闭表单验证
HTML5 表单默认会触发浏览器内置校验(比如 required、type="email"),想跳过所有前端验证,直接提交,最直接的方式是在 标签上加 novalidate 属性。
它不依赖 JavaScript,也不影响后端逻辑,纯粹告诉浏览器:“别跑校验逻辑,我来处理。”
-
novalidate是布尔属性,写上即生效,无需赋值(novalidate="false"无效) - 只作用于当前
,不影响页面其他表单 - 提交时
submit事件仍会触发,checkValidity()也仍可调用,但浏览器不会自动弹红框或阻止提交
formnovalidate 按钮级绕过验证的用法
如果只想让某个提交按钮跳过校验(比如“暂存草稿”按钮),而不是整个表单,就该用 formnovalidate —— 它是 或 的属性。
常见场景:一个表单里有「保存草稿」和「正式提交」两个按钮,前者不校验,后者走默认流程。
立即学习“前端免费学习笔记(深入)”;
- 必须配合
type="submit"才生效;type="button"不会触发表单提交,自然也不涉及校验 - 不需要指定
form属性,它自动关联最近的父 - 多个 submit 按钮可混用:
formnovalidate的按钮跳过校验,没加它的仍按 HTML5 规则校验
禁用验证后,checkValidity() 和 reportValidity() 还管用吗
禁用验证只是跳过浏览器自动拦截,DOM API 本身不受影响。也就是说:
-
form.checkValidity()依然返回true/false,校验逻辑照常执行 -
form.reportValidity()依然会弹出错误提示(如果字段不合法),但它不会阻止表单提交——因为novalidate已经解除了提交拦截 - 若需彻底屏蔽提示,得手动
event.preventDefault()或不用它
所以别误以为加了 novalidate 就等于“删除了所有校验能力”,它只是关掉了自动干预开关。
测试时忽略校验的常见陷阱
做 E2E 或单元测试时,有人直接在测试代码里加 novalidate,但容易忽略两点:
- 真实用户可能没开 JS,而
novalidate是纯 HTML 层控制,这点没问题;但若测试依赖document.querySelector('input').value = 'xxx'后直接click(),某些浏览器(如旧版 Safari)可能仍触发input的实时校验样式(红边),干扰断言 - 用 Puppeteer 或 Playwright 模拟点击时,记得确认是否真的触发了
submit事件——有些框架会拦截原生提交并改用 fetch,此时novalidate对它完全无效 - CI 环境中若用 headless Chrome,
reportValidity()调用不会真弹窗,但会返回false,可能造成断言失败,需提前 mock 或跳过
真正要“忽略校验”的测试,往往不是靠 HTML 属性,而是控制输入值满足规则,或 stub 掉校验方法——novalidate 只解决提交拦截这层,别让它背锅到整个验证链路。











