--- title: Constraint validation API slug: Web/API/Constraint_validation tags: - API - Constraint validation - Landing - NeedsTranslation - Reference - TopicStub translation_of: Web/API/Constraint_validation ---
The Constraint Validation API enables checking values that users have entered into form controls, before submitting the values to the server.
Certain HTML form controls, such as {{HTMLElement("input")}}, {{HTMLElement("select")}} and {{HTMLElement("textarea")}}, can restrict the format of allowable values, using attributes like required and pattern to set basic constraints.
However, you may want to impose more complex constraints, or to provide clearer reporting of validation failures than the defaults. This can be done using the Constraint Validation API.
Note: Client-side constraint validation doesn't remove the need for validation on the server side. Even though client-side validation can prevent many common kinds of invalid values, invalid ones can still be sent by older browsers or by attackers trying to trick your web application. Therefore, you need to also validate input values on the server side, in a way that is consistent with what is done on the client side. Client side validation is a tool for giving quick feedback to the user. You should not rely on it to completely sanitize data received by the server.
Validation of constraints through the constraint validation API is done either on a single form element or at the form level, on the {{ HTMLElement("form") }} element itself.
The constraint validation API extends the interfaces for the form-associated elements listed below with a number of new properties and methods (elements that can have a form attribute that indicates their form owner):
HTMLButtonElementHTMLFieldsetElementHTMLInputElementHTMLObjectElementHTMLOutputElementHTMLSelectElementHTMLTextAreaElementvalidityValidityState object, whose properties represent validation errors for the value of that element.validationMessagesetCustomValidity(), this will be shown.willValidatetrue if the element is a candidate for constraint validation; and false otherwise. Elements with the HTMLObjectElement interface are never candidates for constraint validation. Others may be barred from constraint validation depending on specific conditions.checkValidity()false; otherwise it returns true.reportValidity()false, and then reports the validity status to the user in whatever way the user agent has available. Otherwise, it returns true.setCustomValidity(message)Take the following form:
<form> <label for="name">Enter username (upper and lowercase letters): </label> <input type="text" name="name" id="name" required pattern="[A-Za-z]+"> <button>Submit</button> </form>
The basic HTML form validation features will cause this to produce a default error message if you try to submit the form with either no valid filled in, or a value that does not match the pattern.
If you wanted to instead display custom error messages, you could use JavaScript like the following:
const nameInput = document.querySelector('input');
const form = document.querySelector('form');
nameInput.addEventListener('input', () => {
nameInput.setCustomValidity('');
nameInput.checkValidity();
});
nameInput.addEventListener('invalid', () => {
if(nameInput.value === '') {
nameInput.setCustomValidity('Enter your username!');
} else {
nameInput.setCustomValidity('Usernames can only contain upper and lowercase letters. Try again!');
}
});
The example renders like so:
{{EmbedLiveSample('Examples')}}
In brief:
checkValidity() method via the input event handler.invalid event is raised, and the invalid event handler function is run. Inside this function we work out whether the value is invalid because it is empty, or because it doesn't match the pattern, using an if() block, and set a custom validity error message.setCustomValidity() with an empty string value. We therefore do this every time the input event is raised. If you don't do this, and a custom validity was previously set, the input will register as invalid, even if it current contains a valid value on submission.Note: Firefox supported a proprietary error attribute — x-moz-errormessage — for many versions, which allowed you set custom error messages in a similar way. This has been removed as of version 66 (see bug 1513890).
| Specification | Status | Comment |
|---|---|---|
| {{ SpecName('HTML WHATWG', 'forms.html#the-constraint-validation-api', 'constraint validation API') }} | {{Spec2('HTML WHATWG')}} | |
| {{ SpecName('HTML5.1', 'sec-forms.html#the-constraint-validation-api', 'constraint validation API') }} | {{Spec2('HTML5.1')}} | No change from the previous snapshot {{SpecName('HTML5 W3C')}}. |
| {{ SpecName('HTML5 W3C', 'forms.html#the-constraint-validation-api', 'constraint validation API') }} | {{Spec2('HTML5 W3C')}} | First snapshot of {{SpecName('HTML WHATWG')}} containing this interface. |