В Cleave.js определение типа банковской карты основано на анализе
введённых цифр номера и сопоставлении с известными BIN-префиксами. При
каждом изменении значения поля библиотека пересчитывает возможный тип
карты и при необходимости вызывает специальный обработчик
onCreditCardTypeChanged.
Этот механизм встроен в модуль credit card mode и
работает поверх стандартного форматирования номера, разделяя
ответственность между визуальным представлением и логикой определения
типа.
Тип карты может изменяться динамически в процессе ввода, поскольку первые несколько цифр уже позволяют предположить эмитента, но окончательная идентификация уточняется по мере увеличения длины номера.
Обработчик onCreditCardTypeChanged вызывается каждый
раз, когда вычисленный тип карты отличается от предыдущего значения.
Функциональная сигнатура:
onCreditCardTypeChanged: function (type) {}
Параметр type представляет собой строку, содержащую
идентификатор карты или специальное значение unknown, если
тип не определён.
Типичные значения:
visamastercardamexdiscoverdinersjcbunknownИзменение фиксируется только при фактической смене типа, а не при каждом вводе символа, что снижает количество вызовов и уменьшает нагрузку на обработчики.
Подключение обработчика осуществляется через конфигурацию экземпляра Cleave:
const creditCard = new Cleave('#card-number', {
creditCard: true,
onCreditCardTypeChanged: function (type) {
console.log('Detected card type:', type);
}
});
При вводе номера, например 4111, 5111,
3782, библиотека будет последовательно менять тип и
вызывать callback только при переходах между различными состояниями.
Алгоритм определения типа карты основан на следующих этапах:
Каждый ввод символа может потенциально привести к изменению состояния детектора, но callback вызывается только при смене итогового результата.
Основное применение onCreditCardTypeChanged связано с
динамическим обновлением интерфейса:
Пример переключения логотипа:
const icons = {
visa: 'visa-icon',
mastercard: 'mc-icon',
amex: 'amex-icon',
unknown: 'default-icon'
};
const creditCard = new Cleave('#card-number', {
creditCard: true,
onCreditCardTypeChanged: function (type) {
const icon = document.querySelector('.card-icon');
icon.className = '';
icon.classList.add(icons[type] || icons.unknown);
}
});
Такой подход позволяет создавать реактивный интерфейс без дополнительного парсинга значения поля.
На ранних стадиях ввода номер карты часто недостаточен для точного
определения типа. В таких случаях библиотека возвращает
unknown.
Это состояние важно учитывать как нормальное, а не как ошибку. При дальнейшем вводе тип может уточняться.
Особенность заключается в том, что переход возможен в обе стороны:
unknown → visavisa → unknown (при удалении символов)visa → mastercard (при изменении префикса)Каждый переход инициирует вызов обработчика.
При удалении цифр логика пересчитывает тип карты с нуля на основе оставшегося значения. Это означает, что:
Это поведение является ожидаемым и отражает реактивную природу алгоритма.
onCreditCardTypeChanged часто используется совместно с
проверкой длины и Luhn-алгоритмом, но сам по себе не выполняет валидацию
номера.
Типичная схема интеграции:
Пример:
let currentType = 'unknown';
const creditCard = new Cleave('#card-number', {
creditCard: true,
onCreditCardTypeChanged: function (type) {
currentType = type;
updateValidationRules(type);
}
});
function updateValidationRules(type) {
if (type === 'amex') {
console.log('Set AMEX rules: 15 digits');
} else if (type === 'visa') {
console.log('Set VISA rules: 16 digits');
}
}
Несмотря на то, что ввод символов может происходить очень часто, Cleave.js оптимизирует вызовы callback:
Это позволяет безопасно использовать обработчик даже в высоконагруженных интерфейсах без риска деградации производительности.
В сложных формах обработки платежей
onCreditCardTypeChanged применяется для:
Пример динамического ограничения:
function restrictByType(type) {
if (type === 'amex') {
console.log('Allow only 15-digit flow');
}
}
При автозаполнении браузером номер может быть вставлен целиком, что приводит к мгновенному определению типа без промежуточных состояний.
В таких случаях callback вызывается один раз после полной обработки значения, а не поэтапно.
Это важно учитывать при синхронизации UI, поскольку визуальные изменения могут происходить скачкообразно.
onCreditCardTypeChanged работает исключительно в
режиме:
creditCard: true
В других режимах (numeric, date, custom delimiter) этот callback не активируется, поскольку отсутствует логика BIN-анализа.
При переключении режима экземпляра Cleave необходимо учитывать, что состояние типа карты сбрасывается.
Наиболее распространённые проблемы:
unknown)Корректная архитектура предполагает использование
onCreditCardTypeChanged только как сигнала, а не как
источника финальной валидации.
Некоторые корпоративные или локальные карты могут не попадать в стандартную классификацию Cleave.js. В таких случаях:
unknownЭто особенно актуально для закрытых банковских систем и внутренних платёжных решений.