В интерфейсах ввода числовых значений библиотека AutoNumeric управляет не только форматированием числа, но и поведением текстового курсора (caret), который определяет позицию ввода внутри поля. При получении фокуса input-элементом именно логика установки позиции курсора становится критической частью UX, так как форматированные значения содержат разделители тысяч, символы валют, фиксированные знаки после запятой и другие визуальные элементы, не являющиеся частью «сырых» данных.
Работа с курсором при фокусе затрагивает несколько уровней: DOM-события, внутреннее представление значения AutoNumeric, а также синхронизацию между отображаемым форматом и фактическим числом.
При активации поля ввода библиотека перехватывает событие
focus и выполняет ряд преобразований:
Ключевой момент заключается в том, что отображаемая строка может отличаться от редактируемого представления. Например:
1 234 567.89 → визуальный формат
1234567.89 → логическое значение
При переходе в режим редактирования AutoNumeric должен определить, куда именно поставить курсор: в начало, конец, либо оставить его в логически соответствующей позиции.
Опция определяет поведение выделения при получении фокуса. Возможные сценарии:
Полное выделение часто используется в формах, где ввод нового значения полностью заменяет старое. В этом случае позиция курсора не играет роли, так как весь текст становится выбранным диапазоном.
Настройка, определяющая позицию курсора при активации поля. Основные стратегии:
При наличии разделителей тысяч простое позиционирование по строковому индексу становится некорректным, поэтому используется трансляция между форматированной и «чистой» строкой.
Если поле уже содержит значение, поведение зависит от конфигурации:
Особенность заключается в том, что визуальная позиция курсора может не совпадать с индексом строки DOM.
AutoNumeric поддерживает внутренний механизм трансформации индексов. Основная задача — сопоставить:
Пример:
Отображение: 12 345,67
Индекс DOM: 0 12 345 67
Число: 12345.67
Разделители пробела и запятой не входят в числовую модель, поэтому при установке курсора учитываются только значимые символы.
Алгоритм включает:
При отсутствии значения курсор всегда устанавливается в начало или конец поля в зависимости от конфигурации. В этом состоянии нет необходимости учитывать форматирование.
При наличии числа AutoNumeric выполняет:
Например, для значения с фиксированной дробной частью курсор часто устанавливается перед дробной частью, если она уже присутствует.
При повторном получении фокуса после потери активности возможно сохранение последней позиции курсора. Это требует хранения состояния:
При активации выполняется обратное преобразование в DOM-позицию.
Разделители тысяч, валютные символы и суффиксы создают дополнительный слой сложности. Они могут:
Пример:
€ 1 234,56
Здесь символ валюты и пробелы не участвуют в вычислении значения, но влияют на индекс курсора. Поэтому позиционирование требует фильтрации служебных символов.
AutoNumeric использует DOM-события для синхронизации состояния:
focus — первичная активация поля;focusin — всплывающее событие для контейнеров;blur — фиксация значения и нормализация формата.При событии focus происходит подготовка поля к редактированию, включая корректировку курсора. В некоторых режимах значение временно переводится в нефоматированный вид, чтобы упростить редактирование.
При использовании методов ввода (IME, восточные языки) позиция курсора может изменяться асинхронно. В таких случаях:
compositionend)
выполняется повторная синхронизация.Это предотвращает «прыжки» курсора внутри поля.
При вызове element.focus() из JavaScript поведение может
отличаться от пользовательского взаимодействия:
requestAnimationFrame или аналогичные механизмы.Типичная схема:
element.focus();
requestAnimationFrame(() => {
// восстановление позиции курсора
});
Внутреннее состояние AutoNumeric включает:
При фокусе выполняется синхронизация всех компонентов, чтобы исключить рассогласование между отображением и моделью данных. Несоответствие может приводить к:
Редактирование справа налево в числовом поле
Курсор удерживается перед дробной частью, предотвращая случайное изменение целой части числа.
Замена значения целиком
При включённом выделении курсор не позиционируется, так как весь текст уже выбран.
Пошаговый ввод
Курсор перемещается с учётом только значимых символов, игнорируя форматирование.
При вводе цифр AutoNumeric может изменять строку в реальном времени:
Каждое изменение требует пересчёта позиции курсора. Без этого возникает эффект «дрожания», когда каретка смещается после каждого символа.
Механизм стабилизации включает:
Позиция курсора при фокусе в AutoNumeric определяется комбинацией факторов:
Корректная реализация требует постоянного преобразования между отображаемой строкой и числовым значением с учётом всех служебных символов форматирования.