Cleave.js предоставляет удобный способ форматирования и маскирования пользовательского ввода в реальном времени. При работе с многошаговыми формами важно учитывать, что каждый шаг может содержать различные типы данных: номера телефонов, даты, валюту, номера кредитных карт и текстовые поля с ограничениями. Cleave.js позволяет применять отдельные правила форматирования к каждому полю, обеспечивая консистентность данных и улучшая UX.
Для каждого поля необходимо создать отдельный экземпляр Cleave, чтобы настроить соответствующие правила форматирования. Пример для многошаговой формы:
// Поле ввода номера телефона
const phoneInput = new Cleave('#phone', {
phone: true,
phoneRegionCode: 'RU'
});
// Поле ввода даты
const dateInput = new Cleave('#date', {
date: true,
datePattern: ['d', 'm', 'Y']
});
// Поле ввода суммы с разделением тысяч
const amountInput = new Cleave('#amount', {
numeral: true,
numeralThousandsGroupStyle: 'thousand',
numeralDecimalMark: ',',
delimiter: ' '
});
Каждый экземпляр Cleave.js автоматически следит за вводом пользователя и форматирует данные в реальном времени, предотвращая ошибки ввода.
В многошаговых формах часто возникает ситуация, когда поля одного шага нужно форматировать только при активном отображении этого шага. Для этого рекомендуется инициализировать Cleave.js при активации шага и при необходимости уничтожать экземпляр при скрытии шага:
let cleaveInstance;
function activateStep(stepNumber) {
const stepElement = document.querySelector(`#step${stepNumber}`);
stepElement.style.display = 'block';
if (stepNumber === 1) {
cleaveInstance = new Cleave('#phone', {
phone: true,
phoneRegionCode: 'RU'
});
}
}
function deactivateStep(stepNumber) {
const stepElement = document.querySelector(`#step${stepNumber}`);
stepElement.style.display = 'none';
if (cleaveInstance) {
cleaveInstance.destroy();
cleaveInstance = null;
}
}
Такой подход позволяет оптимизировать производительность, особенно на страницах с большим количеством полей.
Телефонные номера: Cleave.js поддерживает маски для международных номеров с автоматическим форматированием и проверкой региона.
Даты: Можно задать шаблон ['d','m','Y']
для формата дд/мм/гггг или любой другой
последовательности.
Валюты и числовые значения: Поддерживается разделение тысяч, настройка десятичного разделителя и фиксированное количество десятичных знаков.
Кредитные карты: Cleave.js автоматически распознаёт тип карты и применяет соответствующую маску.
const creditCardInput = new Cleave('#creditCard', {
creditCard: true,
onCreditCardTypeChanged: function(type) {
console.log('Detected card type:', type);
}
});
Cleave.js форматирует данные, но не выполняет валидацию. Для многошаговых форм важно сочетать Cleave.js с проверкой введённых данных:
function validateStep(stepNumber) {
if (stepNumber === 1) {
const phone = document.querySelector('#phone').value;
return phone.length === 16; // Пример проверки длины с маской +7 (999) 999-99-99
}
if (stepNumber === 2) {
const date = document.querySelector('#date').value;
return /^\d{2}\/\d{2}\/\d{4}$/.test(date);
}
return true;
}
Комбинируя Cleave.js с проверкой данных, можно обеспечить корректный ввод на каждом шаге формы и предотвратить ошибки перед отправкой.
В многошаговых формах нередко возникает необходимость изменять формат ввода динамически, например, переключение между валютами или региональными форматами телефонов:
function switchPhoneRegion(regionCode) {
const phoneField = document.querySelector('#phone');
const currentValue = phoneField.value;
const newCleave = new Cleave(phoneField, {
phone: true,
phoneRegionCode: regionCode
});
newCleave.setRawValue(currentValue);
}
Это позволяет сохранять уже введённые данные, применяя новый формат без потери пользовательского ввода.
Cleave.js позволяет использовать placeholder для
наглядного отображения формата, а также создавать собственные маски для
нестандартных данных:
const customMaskInput = new Cleave('#custom', {
delimiters: ['-', '-'],
blocks: [3, 2, 4],
uppercase: true
});
Такой подход полезен для многошаговых форм с кодами, номерами документов или другими специфическими форматами.
onChange и onInput, особенно если форма
содержит десятки полей.Для корректной работы многошаговых форм важно сохранять значения при
переходе между шагами. Cleave.js предоставляет метод
getRawValue(), который возвращает данные без
форматирования:
const rawPhone = phoneInput.getRawValue(); // '+79991234567'
Эти значения можно хранить в объекте состояния формы и использовать при отправке на сервер, гарантируя корректность данных независимо от формата отображения.