AutoNumeric реализует обработку клавиатурного ввода через перехват низкоуровневых DOM-событий, формируя контролируемый поток символов, который проходит предварительную валидацию, нормализацию и форматирование до попадания в значение инпута. Основная цель такого подхода — исключить некорректные числовые состояния ещё на этапе ввода, а не постфактум исправлять их.
Ключевой механизм основан на обработке событий keydown,
keypress (в legacy-режиме) и input, с
дополнительным анализом контекста поля: текущего значения, позиции
каретки, выделенного диапазона и активной локали.
keydown и управление разрешёнными клавишамиНа этапе keydown AutoNumeric определяет, является ли
нажатая клавиша допустимой в текущем числовом контексте. Внутри
формируется классификация клавиш:
0–9)Каждое событие проходит через фильтр, который учитывает конфигурацию экземпляра:
new AutoNumeric(input, {
decimalCharacter: ",",
digitGroupSeparator: " ",
allowDecimalPadding: true,
negativePositiveSignPlacement: "l"
});
При обработке клавиши происходит проверка:
Если символ не проходит проверку, вызывается
event.preventDefault(), и ввод блокируется до уровня
браузера.
AutoNumeric не работает напрямую с сырыми символами клавиатуры. Вместо этого каждый вводимый символ проходит нормализацию:
, на . или наоборот в зависимости
от decimalCharacterОсобое внимание уделяется ситуации, когда пользователь вводит десятичный разделитель, отличный от настроенного. Например:
decimalCharacter: "."
При вводе запятой , она либо преобразуется в
., либо блокируется, если политика строгая.
Одной из ключевых сложностей является корректная работа с курсором. AutoNumeric не просто добавляет символ в конец строки, а рассчитывает:
После этого происходит пересборка строки:
Пример логики вставки:
const rawValue = "12 345.67";
caretPosition = 3;
inputChar = "9";
Результат:
12 9 345.67 (в логическом виде: 129345.67)
AutoNumeric пересчитывает позицию каретки так, чтобы пользователь оставался в ожидаемом месте ввода.
Удаление символов в числовом поле существенно сложнее стандартного текстового поведения, поскольку форматирование добавляет “невидимые” символы.
AutoNumeric различает два режима:
Удаляет символ слева от каретки, затем:
Удаляет символ справа от каретки, с аналогичной переработкой состояния
Особенность заключается в том, что разделители групп тысяч могут быть автоматически пропущены. Например:
1 234 567
При удалении каретка может “перепрыгивать” через пробелы, чтобы избежать их ручного удаления пользователем.
Если пользователь выделяет часть значения и вводит новый символ, AutoNumeric выполняет операцию замены:
Если выделение включает знак минус или десятичный разделитель, система проверяет допустимость итогового числа. Например, удаление точки может привести к изменению точности, что учитывается при пересчёте.
Событие paste обрабатывается отдельно от клавиатурного
ввода. Причина — вставляемая строка может содержать:
Алгоритм обработки:
minimumValue,
maximumValue)Пример:
"1 234,56 ₽" → "1234.56"
Для языков с методом ввода через IME (китайский, японский, корейский) используются события:
compositionstartcompositionupdatecompositionendAutoNumeric временно отключает строгую валидацию на этапе composition, чтобы не блокировать промежуточные состояния ввода.
Поведение:
compositionend выполняется полная
нормализацияЭто предотвращает ситуацию, при которой IME не может корректно завершить ввод из-за вмешательства форматтера.
Каждый символ проверяется через внутреннюю таблицу допустимых значений:
allowLeadingHyphen: trueПри попытке ввода второго разделителя AutoNumeric блокирует событие.
Отрицательный знак обрабатывается как переключатель состояния, а не как символ вставки строки.
Поведение зависит от конфигурации:
Логика переключения:
AutoNumeric поддерживает два слоя представления:
Клавиатурный ввод всегда работает с raw value, после чего результат преобразуется обратно в display value.
Это позволяет избежать ошибок, связанных с разделителями групп, пробелами и локализацией.
Поведение клавиатуры напрямую зависит от ряда настроек:
decimalCharacterdigitGroupSeparatorallowDecimalCharacterAutoReplacedecimalPlacesminimumValuemaximumValueallowLeadingHyphenmodifyValueOnWheelКаждый параметр влияет на допустимость символов и реакцию на ввод.
Поддерживаются стандартные сочетания:
AutoNumeric не блокирует эти события, но может перехватывать
paste и cut для корректной обработки числового
значения.
В процессе быстрого ввода возможны промежуточные состояния:
AutoNumeric не позволяет таким состояниям закрепиться в DOM. Вместо этого используется стратегия:
Это обеспечивает строгую целостность числового поля даже при нестабильном вводе пользователя.