Автозаполнение браузера

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

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

  • DOM-значение (input.value) изменяется напрямую браузером;
  • события JavaScript могут не срабатывать или срабатывать неочевидным образом;
  • форматирование AutoNumeric может быть не применено автоматически;
  • визуальное отображение может отличаться от внутреннего числового представления.

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

Конфликт между autocomplete и числовыми масками

HTML-атрибут autocomplete становится ключевым фактором в поведении автозаполнения. При активном автозаполнении браузер может:

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

В результате поле ввода оказывается в состоянии, при котором AutoNumeric ещё не успел применить свои правила форматирования.

Типичная конфигурационная проблема проявляется при инициализации:

new AutoNumeric(input, {
  decimalPlaces: 2,
  digitGroupSeparator: ' ',
  decimalCharacter: ','
});

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

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

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

  • до загрузки скриптов;
  • после DOMContentLoaded, но до инициализации AutoNumeric;
  • после инициализации, но без вызова событий input или change.

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

Несоответствие событий ввода

Автозаполнение часто не генерирует стандартные последовательности событий:

  • keydown и keypress отсутствуют;
  • input может не вызываться;
  • change срабатывает только при потере фокуса.

AutoNumeric полагается на эти события для поддержания актуального состояния. При их отсутствии требуется реакция на альтернативные сигналы DOM.

Детектирование автозаполнения через CSS-анимации

Одним из распространённых механизмов обнаружения автозаполнения является использование CSS-анимаций, которые браузеры запускают при применении autofill-стилей. В связке с AutoNumeric это позволяет фиксировать момент изменения значения.

@keyframes autoFillStart {
  from {}
  to {}
}

input:-webkit-autofill {
  animation-name: autoFillStart;
}

Далее в JavaScript отслеживается событие animationstart, после чего выполняется повторное форматирование значения через AutoNumeric API. Подобный подход компенсирует отсутствие стандартных событий ввода.

MutationObserver как механизм контроля значения

Изменения, вносимые автозаполнением, могут фиксироваться через MutationObserver. Наблюдение за атрибутом value позволяет обнаруживать внешние модификации поля:

  • изменение происходит без пользовательского ввода;
  • значение обновляется браузером напрямую;
  • AutoNumeric не всегда синхронизируется автоматически.

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

Проблема форматирования при частичном заполнении

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

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

Парсер библиотеки может интерпретировать такие значения как NaN или как промежуточное состояние, которое затем корректируется при следующем вводе пользователя.

Влияние атрибутов inputmode и type

HTML-атрибуты inputmode="numeric" и type="text" с числовым форматированием используются для управления поведением клавиатуры и автозаполнения. Однако браузерное автозаполнение:

  • игнорирует inputmode в части форматирования;
  • может подставлять значения, характерные для type="number";
  • не учитывает локализацию AutoNumeric.

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

Поведение AutoNumeric при внешнем изменении value

AutoNumeric хранит внутреннее состояние, основанное на нормализованном числе. При внешнем изменении input.value:

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

Для синхронизации требуется повторная инициализация или явное обновление через API библиотеки.

Проблема autofill и стилизации Chrome

В браузерах на основе Chromium автозаполнение сопровождается применением специальных стилей:

  • изменение фона поля;
  • инъекция псевдокласса :-webkit-autofill;
  • асинхронное применение значений после рендера.

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

Особенно заметно это при использовании:

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

Конфликты с форматированием при blur/focus цикле

AutoNumeric часто выполняет форматирование при потере фокуса (blur) и восстановление «сырого» значения при focus. Автозаполнение может происходить между этими событиями:

  • значение вставляется в момент blur;
  • форматирование не учитывает новое содержимое;
  • при следующем focus происходит повторная интерпретация.

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

Поведение при программной установке значения после autofill

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

  • браузер задаёт строковое значение;
  • AutoNumeric интерпретирует его как число;
  • затем применяет форматирование;
  • итоговое отображение отличается от исходного autofill.

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

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

Автозаполнение может подставлять:

  • пустую строку;
  • строку "0";
  • локализованные варианты нуля.

AutoNumeric трактует такие значения по-разному в зависимости от конфигурации emptyInputBehavior:

  • как пустое поле;
  • как ноль;
  • как null в логической модели.

Несоответствие поведения браузера и настроек библиотеки приводит к неожиданной интерпретации данных.

Асинхронность заполнения и задержки инициализации

Некоторые браузеры выполняют autofill с задержкой после загрузки страницы. Если AutoNumeric инициализируется раньше:

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

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

Поведение при повторном входе на страницу

При возврате на страницу из истории браузера (bfcache) автозаполнение может восстанавливать значения без повторного выполнения JavaScript-инициализации. AutoNumeric при этом:

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

Это создаёт рассинхронизацию между сохранённым значением и визуальным представлением.

Влияние автозаполнения на валидацию

При использовании валидации числовых полей автозаполнение может приводить к ложным отрицательным результатам:

  • значение ещё не отформатировано;
  • внутренний парсер AutoNumeric не синхронизирован;
  • валидатор получает промежуточную строку.

В результате корректное число может восприниматься как некорректное до следующего пользовательского взаимодействия.