novalidate 是禁用表单原生验证的最直接方式,需加在 form 标签上而非 input;formnovalidate 仅让特定 submit 按钮跳过校验;setcustomvalidity("") 不关闭原生验证,仅清空自定义错误。

form 标签加 novalidate 是最直接的关闭方式
浏览器对 <form></form> 内的 required、type="email" 等属性会自动触发原生弹窗提示,想彻底禁用,只需在表单标签上加一个布尔属性:novalidate。它不依赖 JavaScript,优先级高于所有字段级验证逻辑。
常见错误是只给某个 input 加 novalidate —— 这个属性只对 <form></form> 有效,input 上写无效。
-
<form novalidate></form>:整表单跳过所有原生校验(包括提交时和失去焦点时的即时检查) -
<form novalidate="novalidate"></form>:等价写法,但推荐无值简写 - 如果用了 JavaScript 手动调用
checkValidity()或reportValidity(),novalidate不影响这些方法执行,只是阻止默认提交拦截
input 上设 formnovalidate 只对特定按钮生效
这个属性不是用来关校验的,而是让「某个提交按钮」绕过校验直接提交——常用于“暂存”“跳过”类按钮。它必须写在 <button type="submit"></button> 或 <input type="submit"> 上,且只对该按钮点击事件起作用。
-
<button type="submit" formnovalidate>暂存草稿</button>:点它不校验,但其他 submit 按钮仍走原生流程 - 它不能单独关闭整个表单的校验行为,也不能写在普通 input 或 form 上
- 若同时存在多个 submit 按钮,只有带
formnovalidate的那个跳过,其余照常触发红框+气泡提示
JavaScript 中调用 setCustomValidity("") 不等于禁用校验
很多人误以为给 input 设置空字符串的自定义错误就能“关掉校验”,其实这只是清除了当前自定义错误,原生约束(如 required、minlength)依然生效。真正想绕过,得配合 novalidate 或移除属性本身。
立即学习“前端免费学习笔记(深入)”;
-
input.setCustomValidity(""):仅清除自定义错误,不影响required等原生规则 -
input.setCustomValidity("xxx"):显式设错,会让checkValidity()返回 false - 若想动态控制某字段是否参与校验,更可靠的做法是临时移除
required属性:input.removeAttribute("required")
禁用后仍需注意兼容性和交互反馈
novalidate 虽然关了浏览器弹窗,但用户可能完全没意识到输入有误,尤其在移动端没有视觉反馈的情况下。这时候你得自己补上错误样式和提示逻辑。
- Chrome/Firefox/Edge 都支持
novalidate,IE10+ 也支持,基本无兼容问题 - 禁用后,
:valid/:invalid伪类依然可用,可用于 CSS 控制边框颜色等,但不会自动触发reportValidity() - 如果用 JS 做校验,记得监听
submit事件并event.preventDefault(),否则表单仍会按默认方式提交
novalidate 就以为万事大吉,结果忘了手写校验逻辑或视觉反馈,导致用户输错邮箱却毫无提示就点了提交。











