formnovalidate必须加在type="submit"的button或input上才有效,对text/select/textarea等无效;需位于form内或通过form属性关联;仅跳过原生提交拦截,不影响validity API和submit事件;Safari兼容性差,关键场景需JS兜底。

formnovalidate 必须加在 type="submit" 的按钮上
它不是通用校验开关,只对真正会触发表单提交的控件生效。加在 <input type="text">、<select> 或 <textarea> 上完全无效,浏览器直接忽略,连控制台警告都不会有。
-
<button type="submit" formnovalidate>保存草稿</button>✅ 正确 -
<button formnovalidate>保存草稿</button>❌ 默认type="button",不提交,属性无意义 -
<button type="reset" formnovalidate>重置</button>❌type="reset"不支持该属性 -
<input type="submit" formnovalidate value="放弃">✅ 同样有效
按钮必须属于某个 form 才能生效
如果按钮写在 <form> 标签外部,formnovalidate 会静默失效——它需要明确的作用域。此时必须用 form 属性显式关联表单 ID。
<form id="myForm">...</form>-
<button type="submit" form="myForm" formnovalidate>外部暂存</button>✅ 关联后才起作用 - 没写
form属性,又不在<form>内部 → 点击后仍触发原生校验
点击时跳过什么、保留什么要分清
formnovalidate 只绕过浏览器在提交瞬间的自动拦截流程,其他验证相关能力照常工作。别误以为它“关掉了验证”。
- 不调用
checkValidity(),不聚焦第一个错误字段,不弹红框/气泡提示 - 但
input.validity.valid、form.checkValidity()返回值不变 -
:invalid伪类依然匹配,CSS 样式可能意外激活(尤其当同时用了novalidate) -
submit事件照常触发,JS 里仍可做自定义逻辑
Safari 兼容性差,关键路径不能依赖
iOS Safari 15.4–17.x 对 formnovalidate 支持不稳定,某些组合下会静默失效:按钮点了,表单却仍被拦住、弹出原生提示。这不是你代码写错了,是浏览器 Bug。
立即学习“前端免费学习笔记(深入)”;
- 上线前务必在真机 Safari 测试带
formnovalidate的按钮 - 稳妥兜底写法:
<button type="submit" formnovalidate onclick="event.preventDefault(); this.form.submit();"> - 避免用
form.requestSubmit()—— 它会无视formnovalidate,重新触发校验
formnovalidate 控制。用户按 Enter 键时,浏览器只看 <form> 是否有 novalidate,或默认第一个 type="submit" 按钮的属性。这个行为和点击按钮完全不同,必须单独处理。



















