form-functionality-library
Version:
A modular, flexible form functionality library for Webflow forms supporting single-step, multi-step, and branching forms
66 lines • 2.93 kB
JavaScript
/**
* Browser Validation Fix Module
* Webflow-aware validation fix that preserves required attributes for Webflow integration
*/
import { logVerbose } from './utils.js';
/**
* Disable browser validation conflicts with Webflow-aware approach
*/
export function initBrowserValidationFix(root = document) {
logVerbose('Initializing Webflow-aware browser validation fix');
// 1. Add novalidate to all forms to prevent browser validation
const forms = root.querySelectorAll('form');
let formsFixed = 0;
forms.forEach((form) => {
if (!form.hasAttribute('novalidate')) {
form.setAttribute('novalidate', 'true');
formsFixed++;
logVerbose(`Added novalidate to form: ${form.id || 'unnamed'}`);
}
});
// 2. Handle required attributes based on form type
const requiredInputs = root.querySelectorAll('input[required], select[required], textarea[required]');
let inputsFixed = 0;
requiredInputs.forEach((input) => {
const fieldName = input.name ||
input.getAttribute('data-step-field-name') ||
'unnamed';
// Check if this input is in a Webflow multistep form
const isWebflowForm = input.closest('form[data-form="multistep"]') !== null;
if (isWebflowForm) {
// For Webflow forms: Keep required attribute, add data-required as backup
input.setAttribute('data-required', 'true');
// Keep the required attribute for Webflow integration
logVerbose(`Webflow form detected - keeping required attribute: ${fieldName}`);
}
else {
// For non-Webflow forms: Convert required to data-required
input.setAttribute('data-required', 'true');
input.removeAttribute('required');
logVerbose(`Non-Webflow form - converted required → data-required: ${fieldName}`);
}
inputsFixed++;
});
// 3. Clear any existing browser validation messages
const inputsWithValidation = root.querySelectorAll('input, select, textarea');
inputsWithValidation.forEach(input => {
if ('setCustomValidity' in input && typeof input.setCustomValidity === 'function') {
input.setCustomValidity('');
}
});
logVerbose(`Webflow-aware validation fix complete: ${formsFixed} forms, ${inputsFixed} inputs processed`);
return {
formsFixed,
inputsFixed,
conflictsEliminated: inputsFixed > 0
};
}
/**
* Check if browser validation conflicts exist
*/
export function hasBrowserValidationConflicts(root = document) {
const formsWithoutNovalidate = root.querySelectorAll('form:not([novalidate])');
const requiredInputs = root.querySelectorAll('input[required], select[required], textarea[required]');
return formsWithoutNovalidate.length > 0 || requiredInputs.length > 0;
}
//# sourceMappingURL=browserValidationFix.js.map