При вводе номера банковской карты в интерфейсе ключевая задача — не только корректно отформатировать строку, но и своевременно определить платёжную систему. Это позволяет адаптировать поведение формы: менять маску ввода, показывать логотип, выполнять предварительную валидацию и снижать количество ошибок пользователя. В Cleave.js этот сценарий реализован через встроенный механизм анализа BIN-последовательностей и сопоставления их с известными префиксами карт.
Основой является параметр конфигурации, активирующий специализированную логику обработки номера:
const cleave = new Cleave(inputElement, {
creditCard: true
});
При включении creditCard: true библиотека переключается
в режим обработки платежных карт. В этом режиме входная строка
рассматривается не как обычное число, а как последовательность,
подлежащая форматированию и классификации.
Дополнительно Cleave.js начинает применять правила группировки цифр (например, 4-4-4-4 для Visa/Mastercard или 4-6-5 для American Express), а также запускает механизм определения типа карты по мере ввода.
Определение типа карты основано на анализе начальных цифр (BIN — Bank Identification Number). Каждый платёжный провайдер использует собственные диапазоны префиксов:
Cleave.js хранит внутренние правила сопоставления префиксов и по мере ввода последовательно проверяет текущую строку. Алгоритм работает инкрементально: после каждого символа выполняется проверка на совпадение с известными масками.
Важно, что распознавание происходит не после завершения ввода, а в реальном времени. Это позволяет заранее адаптировать интерфейс, не дожидаясь полной длины номера.
Одной из ключевых возможностей является реакция на смену определённого типа карты. Для этого используется callback:
const cleave = new Cleave(inputElement, {
creditCard: true,
onCreditCardTypeChanged: function (type) {
console.log(type);
}
});
Функция onCreditCardTypeChanged вызывается каждый раз,
когда библиотека фиксирует изменение предполагаемого типа карты.
Значение type представляет собой строковый идентификатор,
например:
visamastercardamexdiscoverunknownЭтот механизм особенно важен для динамического UI. Например, можно переключать иконки платёжных систем или изменять подсказки в зависимости от текущего значения.
Одной из менее очевидных, но критически важных особенностей является адаптация маски ввода под конкретную карту. Cleave.js не просто определяет тип, но и изменяет правила группировки цифр.
Для American Express используется формат:
XXXX XXXXXX XXXXX
Для большинства других карт:
XXXX XXXX XXXX XXXX
Эта логика встроена в библиотеку и активируется автоматически после определения типа. При этом на ранних этапах ввода, когда тип ещё не определён, используется универсальная маска, которая затем корректируется.
Для повышения точности можно включить строгий режим:
const cleave = new Cleave(inputElement, {
creditCard: true,
creditCardStrictMode: true
});
В этом режиме библиотека менее терпима к частичным совпадениям префиксов. Это снижает вероятность ложного определения типа карты на ранних этапах ввода, особенно когда введено всего 1–2 символа.
Поведение в строгом режиме:
Логика определения основана на наборе правил вида:
При вводе Cleave.js выполняет проверку по принципу «наибольшего
совпадения». Если текущая последовательность подходит под несколько
типов, выбирается наиболее специфичное правило или сохраняется состояние
unknown.
Это важно для новых диапазонов карт, где пересечения встречаются чаще, чем в классических схемах.
Распознанный тип карты часто используется для управления интерфейсом:
Cleave.js предоставляет только механизм определения, а вся реактивная логика обычно реализуется на уровне приложения через callback.
Пример интеграции с UI:
onCreditCardTypeChanged: function (type) {
const icon = document.querySelector('.card-icon');
icon.className = 'card-icon';
if (type !== 'unknown') {
icon.classList.add(type);
}
}
Каждый тип карты имеет свою максимальную длину:
Cleave.js использует эти ограничения для корректировки поведения ввода. При достижении максимальной длины дальнейший ввод может быть ограничен или игнорироваться, в зависимости от конфигурации.
Это снижает вероятность некорректных номеров уже на этапе ввода, не дожидаясь серверной проверки.
На ранних этапах ввода, когда введено недостаточно данных для
классификации, тип карты определяется как unknown. Это
нормальное состояние, которое не следует интерпретировать как
ошибку.
В этот момент:
По мере увеличения длины номера происходит постепенное уточнение типа.
Некоторые диапазоны BIN пересекаются или расширяются с течением времени. В таких случаях Cleave.js использует приоритетность правил. Однако в случае неоднозначности возможно кратковременное переключение между типами при вводе каждой новой цифры.
Типичная ситуация:
5 → возможны Mastercard4 → сужение диапазонаТакая динамика является нормальной частью инкрементального анализа.
Хотя Cleave.js не выполняет полноценную проверку валидности номера (например, алгоритм Луна), определение типа карты часто используется как первый слой валидации. На основе типа можно применять дополнительные правила:
Таким образом, механизм определения типа карты становится точкой входа в более сложную систему валидации платёжных данных.