Выделение содержимого при фокусе

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

При активации поля ввода библиотека синхронизирует отображаемое значение с внутренним числовым состоянием и затем применяет правила поведения курсора. На этом этапе возможны три базовые стратегии:

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

Эти стратегии управляются настройками и могут комбинироваться с обработкой событий фокуса браузера.

Полное выделение значения

Наиболее распространённое поведение — автоматическое выделение всего содержимого при получении фокуса. Оно активируется параметрами конфигурации, связанными с selectOnFocus и его вариациями.

При включённом режиме поле ведёт себя следующим образом:

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

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

Параметр selectOnFocus и его поведение

selectOnFocus управляет базовой логикой выделения при активации поля через клавиатуру или программный вызов focus().

Поведение можно описать через внутреннюю последовательность:

  1. поле получает фокус;
  2. AutoNumeric перехватывает событие;
  3. выполняется форматирование отображаемого значения;
  4. применяется select() к содержимому input.

При этом важно, что выделение происходит уже после того, как браузер установил курсор по умолчанию, что позволяет переопределить стандартное поведение HTML.

Различие selectOnFocus и selectOnFocusIn

В более сложных сценариях различается момент срабатывания:

  • selectOnFocus — реагирует на сам факт получения фокуса;
  • selectOnFocusIn — ориентируется на событие focusin, которое всплывает и позволяет более точно контролировать поведение при вложенных элементах.

Разница проявляется в интерфейсах, где поле может находиться внутри сложных компонентов (например, таблиц или кастомных форм). В таких случаях focusin позволяет избежать повторного или некорректного выделения при переключениях между дочерними элементами.

Частичное выделение числовой части

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

  • символ валюты;
  • разделители тысяч;
  • дополнительные префиксы или суффиксы.

В этом режиме AutoNumeric может выделять только цифры, игнорируя:

  • символы валют;
  • пробелы-разделители;
  • скобки отрицательных значений.

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

Управление позицией курсора: caretPositionOnFocus

Параметр caretPositionOnFocus определяет, где будет установлен курсор, если полное выделение отключено.

Возможные стратегии поведения:

  • установка курсора в конец значения;
  • установка курсора в начало;
  • позиционирование в соответствии с логикой редактирования числа;
  • восстановление последней позиции (в зависимости от реализации и состояния поля).

Этот параметр критичен в сценариях, где пользователь возвращается к редактированию ранее введённого значения, поскольку позволяет избежать полного сброса позиции ввода.

Влияние emptyOnFocus на выделение

Если поле допускает временное очищение при активации, поведение выделения изменяется.

При включённом emptyOnFocus:

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

Это создаёт эффект «чистого ввода», при котором пользователь сразу вводит новое число без необходимости удаления старого значения.

Взаимодействие с форматированием числа

Выделение тесно связано с тем, как AutoNumeric отображает число. При фокусе может происходить временная нормализация значения:

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

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

Особенно заметны различия при работе с:

  • отрицательными числами (знак минус может не попадать в выделение);
  • числами с высокой разрядностью;
  • значениями с фиксированным количеством десятичных знаков.

Программный фокус и влияние на выделение

При вызове focus() из JavaScript поведение не отличается от пользовательского взаимодействия, однако порядок событий может быть другим:

const anElement = new AutoNumeric('#price', {
  selectOnFocus: true
});

document.querySelector('#price').addEventListener('click', () => {
  anElement.set(12345.67);
  document.querySelector('#price').focus();
});

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

Поведение при повторном фокусе

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

  • повторное выделение может не происходить, если курсор уже внутри поля;
  • выделение может сбрасываться при клике мышью;
  • поведение зависит от сочетания selectOnFocus и событий click, mousedown и focus.

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

Особенности работы на мобильных устройствах

На мобильных устройствах поведение выделения ограничено возможностями виртуальной клавиатуры и браузера:

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

AutoNumeric в таких условиях старается сохранить консистентность значения, но не всегда может полностью контролировать UI-слой ввода.

Сценарии комбинированного поведения

В реальных конфигурациях параметры выделения часто комбинируются:

  • selectOnFocus: true + emptyOnFocus: false — полное выделение значения при входе;
  • selectOnFocus: false + caretPositionOnFocus: 'end' — установка курсора в конец числа;
  • selectNumberOnly: true + форматирование валюты — редактирование только числовой части без влияния на символы.

Такие комбинации позволяют тонко управлять тем, как пользователь взаимодействует с числовым полем, не нарушая визуальную структуру данных.

Поведение при наличии разделителей и символов

При включённых разделителях тысяч и валютных префиксах выделение может вести себя неодинаково для разных частей строки:

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

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