В Cleave.js обработка изменений значения устроена иначе, чем в
стандартных DOM-инпутов. Библиотека не полагается исключительно на
нативное событие onchange или oninput, а
вводит собственный уровень абстракции через механизм форматирования и
перехвата значения. Центральным элементом становится callback
onValueChanged, который вызывается при каждом изменении
внутреннего состояния поля ввода.
onChange и onValueChangedВ стандартном JavaScript поведение инпута определяется DOM-событиями:
input — вызывается при каждом вводе символаchange — вызывается при потере фокуса и изменении
значенияCleave.js работает поверх этих событий, но не ограничивается ими. Причина в том, что библиотека постоянно переформатирует значение, добавляя пробелы, дефисы, слэши и другие разделители. В результате:
Поэтому вместо прямого использования onchange
используется:
onValueChanged — основной механизм отслеживания
измененийonValueChangedПри инициализации Cleave.js callback передаётся через конфигурацию:
const cleave = new Cleave(inputElement, {
phone: true,
onValueChanged: function(e) {
// логика обработки
}
});
Параметр e содержит структурированную информацию о
состоянии поля:
e.target.value — отформатированное значениеe.target.rawValue — «чистое» значение без маскиОдной из ключевых особенностей Cleave.js является разделение данных на два слоя:
Это то, что видит пользователь:
+7 (777) 123-45-67
Оно предназначено исключительно для отображения и улучшения UX.
Это значение без форматирования:
77771234567
Именно rawValue используется для:
onValueChangedconst cleave = new Cleave('#phone', {
phone: true,
phoneRegionCode: 'KZ',
onValueChanged: function(e) {
console.log('Formatted:', e.target.value);
console.log('Raw:', e.target.rawValue);
}
});
В этом примере каждый ввод пользователя приводит к:
onValueChangedonValueChanged вызывается:
Это означает, что обработчик может вызываться десятки раз в секунду при активном вводе.
Следствие:
Cleave.js активно управляет позицией курсора, чтобы сохранить логичность ввода при форматировании. Например:
В контексте onValueChanged это приводит к важному
эффекту:
Поэтому любые манипуляции с DOM внутри onValueChanged
могут конфликтовать с внутренним механизмом библиотеки.
onChange в связке с Cleave.jsХотя Cleave.js использует собственный callback, нативное событие
change или input всё ещё может быть
полезно.
Однако есть нюанс:
onChange DOM срабатывает уже после форматированияПример совмещения:
inputElement.addEventListener('change', (e) => {
console.log('Native change:', e.target.value);
});
Но в реальной практике:
onValueChanged предпочтительнееchange используется только для интеграции с
внешними библиотекамиCleave.js часто используется совместно с валидацией формы. В таком
случае onValueChanged становится точкой синхронизации:
const cleave = new Cleave('#card', {
creditCard: true,
onValueChanged: function(e) {
const raw = e.target.rawValue;
if (raw.length < 16) {
setError('Номер карты слишком короткий');
} else {
clearError();
}
}
});
Особенности такого подхода:
rawValue, а не отображаемая
строкаПри использовании в SPA (React, Vue, Angular)
onValueChanged часто становится мостом между DOM и
состоянием приложения.
onValueChanged: function(e) {
const rawValue = e.target.rawValue;
updateState({
phone: rawValue
});
}
Важно учитывать:
onValueChangedОшибка:
setValue(e.target.value);
Проблема:
Ошибка:
Правильнее:
При использовании controlled input (например, в React):
Это требует аккуратной синхронизации value и
rawValue.
onValueChangedЧтобы снизить нагрузку, часто применяется задержка обработки:
let timeout;
onValueChanged: function(e) {
clearTimeout(timeout);
timeout = setTimeout(() => {
const raw = e.target.rawValue;
validate(raw);
}, 300);
}
Это особенно важно для:
Cleave.js вызывает onValueChanged не только при
пользовательском вводе, но и при:
cleave.setRawValue('77771234567');
или
cleave.setValue('+7 777 123 45 67');
В таких случаях:
Логика можно представить как последовательность:
onValueChangedvalue и rawValueЭта цепочка делает onValueChanged ключевой точкой
интеграции Cleave.js с внешними системами, заменяя классический
onChange в большинстве сценариев использования.