This JavaScript code helps you to create a functionality to prevent form submit until validation is complete. It adds the "novalidate"
attribute to the form, ensuring that HTML5 native validation is bypassed. The code then validates each form field on blur, displaying relevant error messages and styling.
On form submission, it checks all fields for errors, preventing submission if any are found and focusing on the first erroneous field. This ensures user-entered data meets specified criteria for name, email, URL, and radio buttons.
You can integrate this code to enhance your form’s user experience and data accuracy.
How to Create Functionality in JavaScript to Prevent Form Submit Until Validation
1. First, copy and paste the following HTML code into your web page. This code includes a simple form with fields for name, email, URL, and radio buttons. Ensure your form has the class "validate"
for the JavaScript code to target.
<form class="validate" action="#"> <div> <label for="text">Name</label> <input type="text" id="text" required> </div> <div> <label for="email">Email</label> <input type="email" id="email" title="The domain portion of the email address is invalid (the portion after the @)." pattern="^([^\x00-\x20\x22\x28\x29\x2c\x2e\x3a-\x3c\x3e\x40\x5b-\x5d\x7f-\xff]+|\x22([^\x0d\x22\x5c\x80-\xff]|\x5c[\x00-\x7f])*\x22)(\x2e([^\x00-\x20\x22\x28\x29\x2c\x2e\x3a-\x3c\x3e\x40\x5b-\x5d\x7f-\xff]+|\x22([^\x0d\x22\x5c\x80-\xff]|\x5c[\x00-\x7f])*\x22))*\x40([^\x00-\x20\x22\x28\x29\x2c\x2e\x3a-\x3c\x3e\x40\x5b-\x5d\x7f-\xff]+|\x5b([^\x0d\x5b-\x5d\x80-\xff]|\x5c[\x00-\x7f])*\x5d)(\x2e([^\x00-\x20\x22\x28\x29\x2c\x2e\x3a-\x3c\x3e\x40\x5b-\x5d\x7f-\xff]+|\x5b([^\x0d\x5b-\x5d\x80-\xff]|\x5c[\x00-\x7f])*\x5d))*(\.\w{2,})+$" required> </div> <div> <label for="url">URL</label> <input type="url" id="url" title="The URL is a missing a TLD (for example, .com)." pattern="^(?:(?:https?|HTTPS?|ftp|FTP):\/\/)(?:\S+(?::\S*)?@)?(?:(?!(?:10|127)(?:\.\d{1,3}){3})(?!(?:169\.254|192\.168)(?:\.\d{1,3}){2})(?!172\.(?:1[6-9]|2\d|3[0-1])(?:\.\d{1,3}){2})(?:[1-9]\d?|1\d\d|2[01]\d|22[0-3])(?:\.(?:1?\d{1,2}|2[0-4]\d|25[0-5])){2}(?:\.(?:[1-9]\d?|1\d\d|2[0-4]\d|25[0-4]))|(?:(?:[a-zA-Z\u00a1-\uffff0-9]-*)*[a-zA-Z\u00a1-\uffff0-9]+)(?:\.(?:[a-zA-Z\u00a1-\uffff0-9]-*)*[a-zA-Z\u00a1-\uffff0-9]+)*(?:\.(?:[a-zA-Z\u00a1-\uffff]{2,}))\.?)(?::\d{2,5})?(?:[/?#]\S*)?$" required> </div> <div> <strong>Radio Buttons</strong> <label class="label-normal"> <input type="radio" name="radio" id="radio-1" required> Yes </label> <label class="label-normal"> <input type="radio" name="radio" id="radio-2" required> No </label> </div> <input type="submit" class="button" value="Submit"> </form>
2. Copy the following CSS code into your stylesheet. These styles ensure a visually appealing and user-friendly form. You can customize the styles according to your website’s design.
body { font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "Roboto", "Oxygen", "Ubuntu", "Cantarell", "Fira Sans", "Droid Sans", "Helvetica Neue", sans-serif; font-size: 112.5%; } /** * Form Styles */ form{ background: #fff; padding: 12px; } label { display: block; font-weight: bold; margin-bottom: 0.5em; } .label-normal { font-weight: normal; } .description-date { color: #808080; font-size: 0.8em; font-weight: normal; } .supports-date .description-date { display: none; } input, select { display: inline-block; font-size: 1em; margin-bottom: 1em; padding: 0.25em 0.5em; width: 100%; box-sizing: border-box; } [type="checkbox"], [type="radio"] { margin-bottom: 0.5em; width: auto; } .button { background-color: #0088cc; border: 1px solid #0088cc; border-radius: 1px; color: #ffffff; display: inline-block; font-size: 0.9375em; font-weight: normal; line-height: 1.2; margin-right: 0.3125em; margin-bottom: 0.3125em; padding: 0.5em 0.6875em; width: auto; } .button:active, .button:focus, .button:hover { background-color: #005580; border-color: #005580; color: #ffffff; text-decoration: none; } .button:active { box-shadow: inset 0 0.15625em 0.25em rgba(0, 0, 0, 0.15), 0 1px 0.15625em rgba(0, 0, 0, 0.05); } /** * Errors */ .error { border-color: red; } .error-message { color: red; font-style: italic; margin-bottom: 1em; }
3. Finally, copy and paste the JavaScript code at the end of your HTML file or include it in a separate script file. This code adds the “novalidate” attribute to your form, disabling native HTML5 validation. It then implements custom validation logic for each field, showing error messages on blur and preventing form submission if errors exist.
// Add the novalidate attribute when the JS loads var forms = document.querySelectorAll('.validate'); for (var i = 0; i < forms.length; i++) { forms[i].setAttribute('novalidate', true); } // Validate the field var hasError = function (field) { // Don't validate submits, buttons, file and reset inputs, and disabled fields if (field.disabled || field.type === 'file' || field.type === 'reset' || field.type === 'submit' || field.type === 'button') return; // Get validity var validity = field.validity; // If valid, return null if (validity.valid) return; // If field is required and empty if (validity.valueMissing) return 'Please fill out this field.'; // If not the right type if (validity.typeMismatch) { // Email if (field.type === 'email') return 'Please enter an email address.'; // URL if (field.type === 'url') return 'Please enter a URL.'; } // If too short if (validity.tooShort) return 'Please lengthen this text to ' + field.getAttribute('minLength') + ' characters or more. You are currently using ' + field.value.length + ' characters.'; // If too long if (validity.tooLong) return 'Please shorten this text to no more than ' + field.getAttribute('maxLength') + ' characters. You are currently using ' + field.value.length + ' characters.'; // If number input isn't a number if (validity.badInput) return 'Please enter a number.'; // If a number value doesn't match the step interval if (validity.stepMismatch) return 'Please select a valid value.'; // If a number field is over the max if (validity.rangeOverflow) return 'Please select a value that is no more than ' + field.getAttribute('max') + '.'; // If a number field is below the min if (validity.rangeUnderflow) return 'Please select a value that is no less than ' + field.getAttribute('min') + '.'; // If pattern doesn't match if (validity.patternMismatch) { // If pattern info is included, return custom error if (field.hasAttribute('title')) return field.getAttribute('title'); // Otherwise, generic error return 'Please match the requested format.'; } // If all else fails, return a generic catchall error return 'The value you entered for this field is invalid.'; }; // Show an error message var showError = function (field, error) { // Add error class to field field.classList.add('error'); // If the field is a radio button and part of a group, error all and get the last item in the group if (field.type === 'radio' && field.name) { var group = document.getElementsByName(field.name); if (group.length > 0) { for (var i = 0; i < group.length; i++) { // Only check fields in current form if (group[i].form !== field.form) continue; group[i].classList.add('error'); } field = group[group.length - 1]; } } // Get field id or name var id = field.id || field.name; if (!id) return; // Check if error message field already exists // If not, create one var message = field.form.querySelector('.error-message#error-for-' + id ); if (!message) { message = document.createElement('div'); message.className = 'error-message'; message.id = 'error-for-' + id; // If the field is a radio button or checkbox, insert error after the label var label; if (field.type === 'radio' || field.type ==='checkbox') { label = field.form.querySelector('label[for="' + id + '"]') || field.parentNode; if (label) { label.parentNode.insertBefore( message, label.nextSibling ); } } // Otherwise, insert it after the field if (!label) { field.parentNode.insertBefore( message, field.nextSibling ); } } // Add ARIA role to the field field.setAttribute('aria-describedby', 'error-for-' + id); // Update error message message.innerHTML = error; // Show error message message.style.display = 'block'; message.style.visibility = 'visible'; }; // Remove the error message var removeError = function (field) { // Remove error class to field field.classList.remove('error'); // Remove ARIA role from the field field.removeAttribute('aria-describedby'); // If the field is a radio button and part of a group, remove error from all and get the last item in the group if (field.type === 'radio' && field.name) { var group = document.getElementsByName(field.name); if (group.length > 0) { for (var i = 0; i < group.length; i++) { // Only check fields in current form if (group[i].form !== field.form) continue; group[i].classList.remove('error'); } field = group[group.length - 1]; } } // Get field id or name var id = field.id || field.name; if (!id) return; // Check if an error message is in the DOM var message = field.form.querySelector('.error-message#error-for-' + id + ''); if (!message) return; // If so, hide it message.innerHTML = ''; message.style.display = 'none'; message.style.visibility = 'hidden'; }; // Listen to all blur events document.addEventListener('blur', function (event) { // Only run if the field is in a form to be validated if (!event.target.form.classList.contains('validate')) return; // Validate the field var error = hasError(event.target); // If there's an error, show it if (error) { showError(event.target, error); return; } // Otherwise, remove any existing error message removeError(event.target); }, true); // Check all fields on submit document.addEventListener('submit', function (event) { // Only run on forms flagged for validation if (!event.target.classList.contains('validate')) return; // Get all of the form elements var fields = event.target.elements; // Validate each field // Store the first field with an error to a variable so we can bring it into focus later var error, hasErrors; for (var i = 0; i < fields.length; i++) { error = hasError(fields[i]); if (error) { showError(fields[i], error); if (!hasErrors) { hasErrors = fields[i]; } } } // If there are errrors, don't submit form and focus on first element with error if (hasErrors) { event.preventDefault(); hasErrors.focus(); } // Otherwise, let the form submit normally // You could also bolt in an Ajax form submit process here }, false);
If needed, customize the validation rules in the JavaScript code to match your specific requirements. You can adjust the error messages, validation patterns, and field-specific criteria based on your application’s needs.
That’s all! hopefully, you have successfully created a functionality in JavaScript to prevent form submit until validation process. If you have any questions or suggestions, feel free to comment below.
Similar Code Snippets:
I code and create web elements for amazing people around the world. I like work with new people. New people new Experiences.
I truly enjoy what I’m doing, which makes me more passionate about web development and coding. I am always ready to do challenging tasks whether it is about creating a custom CMS from scratch or customizing an existing system.