禁用 html5 原生表单验证最可靠的方式是在 上添加 novalidate 属性,它彻底禁用默认弹窗和提交拦截但保留 validity 状态供 js 读取;另一种是结合 event.preventdefault() 与手动校验,但仍需 novalidate 配合,否则原生提示仍会触发。
禁用 HTML5 原生表单验证的两种可靠方式
想让自定义 JS 验证逻辑完全接管,必须先关掉浏览器默认的 required、type="email" 等触发的弹窗和提交拦截。最直接有效的是在 <form></form> 上加 novalidate 属性——它会彻底禁用所有原生验证反馈(包括 checkValidity() 的 UI 行为),但保留 validity 对象供你读取状态。
另一种是动态控制:给表单元素设 formnovalidate(仅对提交按钮生效),或在 JS 中调用 event.preventDefault() 并手动调用 form.checkValidity() 判断,但此时仍需配合 novalidate,否则点击提交时浏览器仍会弹出原生提示。
-
novalidate是布尔属性,写成novalidate=""或单纯novalidate都行 - 只加在
<form></form>上即可,不用每个 input 都加 - 加了之后
input.reportValidity()依然能触发原生 UI,如需彻底屏蔽,得额外监听invalid事件并preventDefault()
为什么 setCustomValidity("") 不能替代 novalidate
setCustomValidity("") 只是把当前字段的自定义错误清空,并不阻止其他原生规则(比如 type="email" 格式不符时仍会报错)。它本质是往 validity.customError 写值,而 validity.typeMismatch、validity.valueMissing 等仍可能为 true,导致 checkValidity() 返回 false。
常见误操作:只对某个 input 调用 setCustomValidity("") 就以为“禁用了验证”,结果提交时还是被拦住——因为浏览器检查的是整个表单的综合 validity 状态,不是单看 customError。