应使用 type="submit" 按钮并添加 formnovalidate 属性,且必须位于 form 内或通过 form="myform" 显式关联;避免用 type="button"、错误赋值、js 的 submit() 或 preventdefault()。

直接加 formnovalidate 属性,但必须确保按钮是 type="submit" 且在表单作用域内——否则它根本不会生效。
为什么点“暂存”还是弹红框?
常见错误不是属性写错了,而是按钮没走对提交路径:
-
type="button"的按钮加formnovalidate完全无效——它压根不触发表单提交,属性被浏览器忽略 - 按钮不在
<form></form>标签内,又没用form="myForm"显式关联,formnovalidate失去上下文 - 写了
formnovalidate="false"或formnovalidate=""——它是布尔属性,只看是否存在,赋值反而可能被当真值处理 - Safari 15.4–17.x 在某些混合表单场景下会静默失效,点了仍校验;不能靠它保底
怎么写才真正跳过 required/pattern/email 等所有原生校验
核心是让浏览器跳过 constraint validation API 的自动拦截,但保留表单提交行为:
- 用
<button type="submit" formnovalidate>暂存</button>(推荐),或<input type="submit" formnovalidate value="暂存"> - 如果按钮在表单外,必须配
form="myForm",例如:<button type="submit" form="myForm" formnovalidate>外部暂存</button> - 避免在
onclick里写event.preventDefault()——那会直接阻断提交,formnovalidate根本没机会起作用 - 别在 JS 里调
form.submit()去模拟点击,它无视formnovalidate;要用form.requestSubmit(),它尊重该属性
和 JavaScript 提交逻辑混用时容易踩的坑
formnovalidate 只影响「用户点击提交按钮」这一条路径,对 JS 主动调用完全无感:
-
form.submit()永远跳过所有 HTML5 校验,但它也不触发submit事件,且无法区分“暂存”和“正式提交”意图 -
form.requestSubmit()会触发校验,但若点击的是带formnovalidate的按钮,它就跳过——这是唯一能兼顾语义与行为的 JS 替代方案 - 监听
submit事件时,可通过event.submitter?.hasAttribute('formnovalidate')判断用户点的是哪个按钮,决定是否跳过自定义校验 -
input[type="file"]的值无法通过form.elements直接序列化暂存,得单独用FileReader处理,通常建议暂存时跳过上传字段
最易被忽略的一点:即使 formnovalidate 生效,input.validity.valid 和 form.checkValidity() 返回的仍是真实校验状态,:invalid 伪类也照常匹配——CSS 样式可能意外激活,尤其当同时用了 novalidate 时更混乱。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











