formnovalidate是布尔属性,仅对type="submit"或type="image"的button/input有效,点击时跳过required、pattern、type="email"等原生校验直接提交;它不关闭validity API和:valid/:invalid伪类,需位于form内或通过form属性关联,且优先级高于form的novalidate。

formnovalidate 是什么,它跳过哪些验证
formnovalidate 是 <input> 标签的一个布尔属性,作用是:当该按钮(必须是 type="submit" 或 type="image")被点击时,绕过整个表单的原生 HTML5 表单验证(比如 required、pattern、minlength 等),直接提交。
注意它只对提交按钮生效,且仅影响当前表单的验证行为;它不会禁用 JS 的 checkValidity(),也不会移除 :valid/:invalid 伪类样式。
怎么写才真正生效
必须同时满足三个条件,formnovalidate 才起作用:
- 元素必须是
<input type="submit">或<input type="image">(<button type="submit"></button>也支持) - 该元素必须位于一个
<form></form>内部,或通过form属性显式关联到某个表单 - 不能和
form元素上的novalidate混用——后者是全局禁用,而formnovalidate是局部覆盖
正确示例:
立即学习“前端免费学习笔记(深入)”;
<form> <input required name="email" type="email"> <input type="submit" value="保存"> <input type="submit" value="跳过验证提交" formnovalidate> </form>
错误写法(无效):
<input type="text" formnovalidate> <!-- 非 submit 类型,忽略该属性 --> <button formnovalidate>提交</button> <!-- 缺少 type="submit",默认为 button,不触发提交 -->
和 novalidate 属性的区别在哪
novalidate 是 <form></form> 的属性,设了它,整个表单所有提交按钮都跳过验证;formnovalidate 是按钮级开关,允许你保留主提交按钮的验证,只给“取消”“暂存”“稍后填写”这类按钮豁免权。
常见误用场景:
- 想让“暂存草稿”按钮跳过验证,但把
novalidate加在<form></form>上 → 导致所有按钮都失效,包括主提交流程 - 把
formnovalidate加在普通<input type="button">上 → 完全没效果,因为不触发表单提交 - 用 JS 调用
form.submit()→ 绕过所有 HTML 验证逻辑,此时formnovalidate不参与,也不需要它
容易被忽略的兼容性和副作用
现代浏览器(Chrome/Firefox/Safari/Edge)均支持 formnovalidate,但 IE 完全不识别——如果需兼容 IE,得靠 JS 拦截 submit 事件并调用 event.preventDefault(),再手动提交。
副作用要注意:
- 即使跳过验证,
required字段仍会显示红色边框(如果用了:invalid样式),因为样式状态和验证执行是两套逻辑 - 如果表单有 JS 绑定的
submit事件监听器,formnovalidate不影响该监听器运行,它只跳过原生约束验证(constraint validation API) - 服务器端永远要重新校验——前端跳过验证只是用户体验优化,不是信任依据
真正在意数据完整性的环节,从来不在 formnovalidate 这一行属性上。



















