formnovalidate是button或input[type="submit"]的布尔属性,用于点击时跳过html5原生校验(如required、pattern、min/max等),直接提交表单;它不影响javascript校验、onsubmit事件触发及后端校验,仅作用于浏览器constraint validation api。

formnovalidate 是什么,它能跳过哪些校验
formnovalidate 是 <button></button> 或 <input type="submit"> 的布尔属性,作用是让点击该按钮时**跳过整个表单的原生 HTML5 校验(如 required、pattern、min/max 等)**,直接提交或触发表单事件。它不跳过 JavaScript 手动写的校验,也不影响 onsubmit 事件本身是否触发。
常见错误是以为加了 formnovalidate 就能绕过所有校验逻辑——其实它只影响浏览器内置的 constraint validation API 行为。
怎么写才真正生效
必须满足两个条件:按钮得在 <form></form> 内,且类型为提交类(type="submit" 或无 type 默认为 submit)。formnovalidate 对 type="button" 无效,因为它本来就不会触发表单提交。
-
<button type="submit" formnovalidate>跳过校验提交</button>✅ -
<input type="submit" formnovalidate value="跳过校验">✅ -
<button type="button" formnovalidate>点我没用</button>❌(不会提交表单,属性被忽略) -
<button formnovalidate>没写 type,默认是 submit,可以</button>✅(但建议显式写type="submit"避免歧义)
和 onclick + preventDefault 混用时容易踩的坑
如果按钮同时绑了 onclick 并调用 event.preventDefault(),那 formnovalidate 就没机会起作用——因为表单根本没提交。这时候校验压根不会触发,不是“跳过”,而是“没走那条路”。
想保留表单提交行为(比如仍要发 POST 请求)又跳过校验,就别阻止默认行为;如果只是想执行 JS 逻辑,那就用 type="button",formnovalidate 也别加,省得误导自己。
- 需要真实提交但跳过校验 → 用
type="submit"+formnovalidate,不写preventDefault - 只想运行 JS,不提交 → 用
type="button",删掉formnovalidate - 既想提交又想改数据再提交 → 先用
event.preventDefault(),手动调form.submit()(此时formnovalidate不生效,得靠form.reportValidity()或form.checkValidity()控制)
兼容性和实际效果差异
formnovalidate 在所有现代浏览器(Chrome、Firefox、Safari、Edge)都支持,IE10+ 也支持。但它只影响提交时的校验提示和 checkValidity() 返回值,不影响 validity 对象本身的字段状态——比如一个空的 required 输入框,点了 formnovalidate 按钮后,它的 element.validity.valueMissing 还是 true,只是浏览器不拦你提交。
服务端永远不能信任前端跳过的校验,这点容易被忽略。前端跳过只是用户体验优化,后端该验还得验。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











