Навигация с клавиатуры

AutoNumeric полностью перехватывает управление вводом в числовых полях, заменяя стандартное поведение <input> собственной моделью форматирования и управления кареткой. Это означает, что любая клавиатурная навигация должна рассматриваться не как работа с «сырым» текстом, а как взаимодействие с форматированным числовым представлением.

Фокус в поле, управляемом AutoNumeric, всегда переводится в режим «контролируемого ввода», где:

  • отображаемое значение может содержать разделители тысяч, символы валют и префиксы/суффиксы;
  • позиция каретки не совпадает напрямую с индексами строки value;
  • ввод и навигация интерпретируются через слой нормализации библиотеки.

Ключевой момент: стандартные браузерные механики (input.selectionStart, input.value) становятся вторичными по отношению к внутреннему состоянию AutoNumeric.


Обработка клавиш перемещения курсора

AutoNumeric переопределяет поведение стрелок и служебных клавиш для корректной работы с форматированными числами.

Стрелки влево и вправо

  • Перемещают каретку внутри числового выражения
  • Игнорируют визуальные символы форматирования (разделители групп)
  • Перескакивают через символы, не относящиеся к числовому значению

Особенность заключается в том, что позиция каретки вычисляется относительно «логического числа», а не строки:

  • запятая тысяч — пропускается
  • пробелы-разделители — игнорируются
  • символ валюты не участвует в навигации

Home и End

Клавиши Home и End работают в контексте очищенного числового представления:

  • Home переводит каретку к первой значимой цифре (или к знаку минус)
  • End переводит каретку в конец числовой части (после последней значимой цифры)

При наличии префикса (например, валютного символа) поведение зависит от конфигурации, но обычно:

  • префикс исключается из области редактирования
  • каретка не может «застревать» внутри служебных символов

Инкрементирование и декрементирование значений

Одной из ключевых функций AutoNumeric является поддержка изменения числового значения через клавиатуру без прямого редактирования текста.

Стрелки вверх и вниз

  • ArrowUp увеличивает значение
  • ArrowDown уменьшает значение

Изменение происходит с учётом текущей позиции каретки:

  • если каретка в разряде единиц → шаг 1
  • если в разряде десятков → шаг 10
  • если в дробной части → шаг определяется количеством знаков после запятой

Пример логики:

  • 123.45

    • курсор на 3 → +1 / -1
    • курсор на 2 (десятки) → +10 / -10
    • курсор на 4 (десятые) → ±0.1

Это поведение может быть адаптировано настройками шага (step), но базовая идея — контекстная чувствительность.


Tab и Shift + Tab

Навигация между элементами формы остаётся на уровне браузера, однако AutoNumeric обеспечивает корректную синхронизацию состояния перед потерей фокуса.

При Tab:

  • выполняется финальная нормализация значения
  • убираются промежуточные символы форматирования
  • фиксируется внутреннее числовое состояние

При Shift + Tab дополнительно учитывается обратный переход без изменения логики форматирования.


Backspace и Delete в контексте форматирования

Удаление символов в AutoNumeric не является прямым удалением строки.

Backspace

  • удаляет ближайшую значимую цифру слева
  • игнорирует разделители тысяч
  • пересчитывает значение после удаления

Delete

  • удаляет значимую цифру справа
  • перескакивает через форматные символы
  • поддерживает корректное смещение дробной части

Особенность: удаление всегда приводит к перерасчёту числа, а не к модификации строки.


Работа с выделением диапазона

Выделение текста (Shift + стрелки) работает в режиме логической сегментации числа:

  • выделение может включать только значимые цифры
  • разделители автоматически игнорируются
  • символы форматирования не участвуют в selection range

При вставке нового значения поверх выделения происходит:

  • нормализация входных данных
  • фильтрация недопустимых символов
  • перерасчёт числа с учётом локали

Конфигурационные параметры, влияющие на навигацию

Поведение клавиатуры в AutoNumeric определяется рядом параметров, которые изменяют интерпретацию событий.

caretPositionOnFocus

Определяет позицию каретки при получении фокуса:

  • начало числа
  • конец числа
  • сохранение последней позиции

Влияние на навигацию:

  • определяет стартовую точку всех клавиатурных операций
  • влияет на первый шаг ArrowUp / ArrowDown

selectOnFocus

При включении:

  • всё значение выделяется при фокусе
  • первая клавиатурная операция заменяет значение целиком

При выключении:

  • сохраняется позиция каретки
  • навигация работает инкрементально

decimalPlacesShownOnFocus

Изменяет отображение дробной части при фокусе:

  • при фокусе может увеличивать точность отображения
  • влияет на шаг изменения стрелками вниз/вверх

Это важно для навигации по дробным значениям, так как изменяет «глубину» активных разрядов.


Взаимодействие клавиатуры с локалями

AutoNumeric учитывает региональные настройки:

  • десятичный разделитель (, или .)
  • разделитель тысяч (пробел, точка, запятая)
  • порядок символов валют

Навигация адаптируется под эти параметры:

  • стрелки не пересекают разделитель дробной части
  • курсор не может остановиться между цифрой и разделителем
  • шаг изменения сохраняет локальную точность представления

Сложные сценарии навигации

Быстрое изменение значения

Комбинация ArrowUp/Down с удержанием:

  • увеличивает/уменьшает значение по ускоряющейся шкале
  • ускорение может зависеть от длительности нажатия
  • перерасчёт происходит без потери точности

Переход между разрядами

При перемещении каретки:

  • десятки → единицы → десятые → сотые
  • перескок между разрядами сохраняет контекст изменения шага

Это позволяет управлять числом без ручного редактирования строки.


Работа с отрицательными числами

Клавиатурная навигация учитывает знак:

  • - не является частью навигационного диапазона
  • Home может переводить каретку перед первым числом после знака
  • изменение значения сохраняет знак до пересечения нуля

Типовые проблемы и их причины

Каретка «прыгает» при вводе

Причина:

  • повторная форматирующая перерисовка строки
  • пересчёт позиции без синхронизации selection

Невозможно попасть в определённую позицию

Причина:

  • символ является форматным (разделитель)
  • AutoNumeric блокирует невалидные позиции каретки

Непредсказуемый шаг стрелок

Причина:

  • несоответствие позиции каретки и логического разряда
  • влияние дробной части и настроек step

Поведенческая модель клавиатуры как конечный автомат

Навигация в AutoNumeric фактически реализуется как состояние:

  • состояние фокуса
  • состояние каретки
  • числовое значение
  • формат отображения

Каждое нажатие клавиши запускает переход:

  1. декодирование клавиши
  2. вычисление логической позиции
  3. трансформация значения (если требуется)
  4. повторное форматирование
  5. восстановление каретки

Эта модель обеспечивает стабильность при работе с форматированными числами, где прямое редактирование строки невозможно без потери структуры.