👀 Live Preview
Try submitting this required field empty—novalidate lets it through:
Leave empty and submit — no browser popup because the form has novalidate.

The novalidate attribute is a boolean HTML attribute on <form> that disables the browser’s built-in constraint validation on submit. Normally, empty required fields, invalid type="email" values, and other HTML5 rules block submission and show validation messages. With novalidate, the form submits without those browser checks—useful when you implement custom JavaScript validation or rely on server-side validation. It does not remove validation attributes from fields; it only stops the browser from enforcing them at submit time.
On form only.
No auto block.
Your own rules.
Always validate.
Per button.
true / false.
novalidate AttributeThe primary purpose of novalidate is to turn off native form validation so you control when and how errors appear. Design systems often need consistent custom error UI instead of browser tooltips. Multi-step wizards may validate each step with JavaScript rather than HTML5 on the whole form. Some apps send raw input to the server and display errors from an API response.
The old reference described it as enabling “faster submissions”—that misses the point. Skipping validation does not make legitimate submits faster; it means invalid data can reach your handler unless you validate elsewhere. Always validate on the server regardless of novalidate.
novalidate is easy for users to bypass in DevTools. Treat it as a UX switch for browser validation, not as server-side protection.
Add the boolean novalidate attribute to a <form>:
<form action="/signup" method="post" novalidate>
<label for="username">Username:</label>
<input type="text" id="username" name="username" required>
<label for="email">Email:</label>
<input type="email" id="email" name="email" required>
<button type="submit">Sign up</button>
</form>novalidate alone; presence disables browser validation.<form>, not on individual inputs.required, pattern, etc.—you can still call input.checkValidity() in JavaScript.formElement.novalidate = true (boolean).formnovalidate on that button instead.The novalidate attribute is boolean—not a string value like the old reference suggested:
novalidate — Attribute present; browser validation disabled on submit.novalidate="" — Also valid in HTML5; same as bare novalidate.form.novalidate = true disables; false re-enables browser validation.const form = document.getElementById("myForm");
form.novalidate = true; // skip browser validation
form.novalidate = false; // restore browser validation| Use case | Markup | Notes |
|---|---|---|
| Disable all browser validation | <form novalidate> | Every submit |
| Default validation | Omit novalidate | Browser blocks invalid submit |
| One button skips validation | <button formnovalidate> | Not on form |
| Toggle via JS | form.novalidate = true | Boolean property |
| Manual check in JS | input.checkValidity() | Still works with novalidate |
| Server safety | Validate in backend | Always required |
| Element | Supported? | Notes |
|---|---|---|
<form> | Yes | Only valid element |
<input>, <button> | No | Use formnovalidate on submit buttons |
<fieldset> | No | Validation scoped via parent form |
novalidate vs formnovalidate| Attribute | On | Effect |
|---|---|---|
novalidate | <form> | Skips browser validation for every submit |
formnovalidate | Submit <button> | Skips validation only when that button is used |
Example: a form with “Save draft” (formnovalidate) and “Publish” (validated) buttons on the same form.
Submit with required fields bypassed, toggle form.novalidate, and custom JavaScript validation.
Try submitting this required field empty—novalidate lets it through:
Leave empty and submit — no browser popup because the form has novalidate.
Required fields that browser validation will not block:
<form action="/submit" method="post" novalidate>
<label for="username">Username:</label>
<input type="text" id="username" name="username" required>
<label for="email">Email:</label>
<input type="email" id="email" name="email" required>
<button type="submit">Submit</button>
</form>Without novalidate, the browser calls reportValidity() before submit. With novalidate, that step is skipped and the submit event proceeds.
Toggle browser validation with form.novalidate:
<form id="dynamicForm">
<input type="email" required>
<button type="submit">Submit</button>
</form>
<script>
const form = document.getElementById("dynamicForm");
form.novalidate = true; // disable browser validation
form.novalidate = false; // re-enable
</script>form.novalidate mirrors the boolean attribute. Modern browsers support toggling it at runtime for dynamic UX (e.g. “edit mode” vs “preview”).
Combine novalidate with your own checks:
<form id="signup" novalidate>
<input type="email" id="email" required>
<button type="submit">Sign up</button>
</form>
<script>
document.getElementById("signup").addEventListener("submit", function (e) {
const email = document.getElementById("email");
if (!email.checkValidity()) {
e.preventDefault();
showCustomError(email.validationMessage);
}
});
</script>novalidate disables automatic blocking on submit. Your script decides whether to call preventDefault() after running custom or API-driven validation logic.
aria-invalid, aria-describedby, and visible text.novalidate does not remove the need for <label> elements.type, required, and ARIA so assistive tech understands field purpose even when browser validation is off.Click submit or press Enter.
If present, skip constraint validation.
Or your JS validates first.
You own validation UX.
The novalidate attribute is supported in all modern browsers on <form> elements. The form.novalidate JavaScript property is also widely supported. HTML5 constraint validation itself is available in Chrome, Firefox, Safari, and Edge.
novalidate compatibilityAll major browsers support the novalidate attribute in production use.
Bottom line: Use novalidate confidently in modern browsers; always add server-side validation.
novalidate when you need custom UI or logic.checkValidity() in JavaScript instead of duplicating every rule.The novalidate attribute disables browser constraint validation on a <form>, giving you room for custom JavaScript or server-driven validation flows.
Use it deliberately, pair it with accessible error handling, and never treat it as a substitute for server-side checks. For per-button control, reach for formnovalidate instead.
novalidateBookmark these before your next novalidate implementation.
Boolean attr.
ScopeOn submit.
BehaviorYour rules.
PatternAlways.
SecurityPer button.
Compare<form> element only. Use formnovalidate on individual submit buttons for partial bypass.novalidate alone. It is not a string value like novalidate="novalidate" as the old reference incorrectly stated.novalidate only affects the browser. Attackers can submit any data directly to your server.novalidate on the form disables validation for all submits. formnovalidate on one button skips validation only for that button.form.novalidate = true disables browser validation; false re-enables it. Works reliably in modern browsers.Practice skipping browser checks, toggling form.novalidate, and custom validation in the Try It editor.
5 people found this page helpful