Обработка некорректного ввода

Модель ввода и точка возникновения некорректных данных

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

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


Классификация некорректного ввода

Некорректный ввод в контексте Inputmask не является единым понятием и разделяется на несколько категорий:

Структурно недопустимые символы

Символы, не соответствующие определению маски. Например, буквы в числовом поле или лишние знаки в шаблоне даты.

Нарушение позиции ввода

Ситуации, когда символ допустим по типу, но вставлен в позицию, не предусмотренную структурой маски (например, месяц > 12 в дате).

Частично заполненные значения

Состояние, при котором часть маски заполнена корректно, но итоговое значение не завершено.

Логически некорректные комбинации

Ввод, формально соответствующий маске, но нарушающий бизнес-правила (например, дата 31 февраля).


Базовый механизм фильтрации

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

Inputmask({
  mask: "99-99-9999",
  definitions: {
    "9": {
      validator: "[0-9]",
      definitionSymbol: "*"
    }
  }
}).mask(input);

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


Поведение при вводе недопустимых символов

При попытке ввода символа, не соответствующего текущей позиции маски, Inputmask:

  1. Игнорирует символ без изменения значения
  2. Либо заменяет текущую позицию, если включен режим перезаписи
  3. Либо перемещает курсор в ближайшую допустимую позицию

Контроль поведения осуществляется параметрами конфигурации и внутренним состоянием маски.

Ключевым аспектом является отсутствие «ошибки» как состояния — некорректный символ просто не попадает в итоговую строку.


Обработка вставки (paste) как источник некорректного ввода

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

Для обработки используется цепочка:

  • предварительная нормализация
  • разбор строки по маске
  • фильтрация символов
  • поствалидация результата
Inputmask({
  mask: "+7 (999) 999-99-99",
  clearIncomplete: true
}).mask(input);

Если вставляемая строка содержит лишние символы (например, буквы, пробелы, дополнительные знаки), они удаляются до применения маски. При включённой опции clearIncomplete незавершённые значения полностью очищаются.


Предобработка через onBeforeMask

Механизм onBeforeMask используется для нормализации входных данных до применения маски. Это ключевой этап устранения некорректных значений, поступающих из внешних источников (API, база данных, автозаполнение).

Inputmask({
  mask: "+7 (999) 999-99-99",
  onBeforeMask: function (value) {
    return value.replace(/\D/g, "");
  }
}).mask(input);

На этом этапе устраняются:

  • пробелы
  • буквы
  • спецсимволы
  • нестандартные разделители

Фактически формируется «чистая» строка, пригодная для дальнейшего наложения маски.


Контроль корректности через isValid и isComplete

Проверка валидности выполняется отдельно от процесса ввода.

isValid

Определяет, соответствует ли значение маске и правилам:

  • структура совпадает
  • все обязательные позиции заполнены
  • отсутствуют запрещённые символы

isComplete

Проверяет только полноту заполнения маски без оценки бизнес-логики.

Разделение этих понятий позволяет различать:

  • формально завершённый ввод
  • и логически корректное значение

Поствалидация через postValidation

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

Inputmask({
  mask: "99/99/9999",
  postValidation: function (buffer, pos, c, currentResult) {
    const day = parseInt(buffer.slice(0, 2), 10);
    const month = parseInt(buffer.slice(3, 5), 10);

    if (month > 12) return false;
    if (day > 31) return false;

    return true;
  }
}).mask(input);

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


Управление некорректным вводом через skipOptionalPartCharacter

Некорректный ввод часто связан с пропуском необязательных частей маски. Параметр skipOptionalPartCharacter определяет символ, который используется для обозначения пропущенных сегментов.

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


Режим очистки incomplete-значений

Параметр clearIncomplete играет ключевую роль в стратегии обработки некорректного ввода.

  • true — незавершённые значения удаляются
  • false — сохраняются в поле

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


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

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

input.value = "ABC123!!!";
Inputmask("999-999").mask(input);

В этом случае Inputmask выполняет принудительную нормализацию:

  • удаление лишних символов
  • сопоставление с маской
  • отбрасывание несоответствующих частей

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


Кастомные определения как инструмент фильтрации

Система definitions позволяет полностью переопределять правила допустимости символов.

Inputmask({
  mask: "aa-999",
  definitions: {
    "a": {
      validator: "[A-Za-z]",
      casing: "upper"
    }
  }
}).mask(input);

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

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

Таким образом формируется активная фильтрация, а не пассивная валидация.


Перехват и коррекция через onBeforeWrite

Механизм onBeforeWrite используется для вмешательства в процесс записи символа в маску.

Inputmask({
  mask: "999-999",
  onBeforeWrite: function (event, buffer, caretPos, opts) {
    return {
      refreshFromBuffer: true,
      buffer: buffer
    };
  }
}).mask(input);

Этот уровень обработки позволяет:

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

Поведение курсора при ошибочном вводе

Некорректный ввод часто связан с нарушением логики перемещения курсора. Inputmask управляет этим через внутреннюю модель позиции:

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

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


Инкрементальная валидация и частичная корректность

Система допускает промежуточно некорректные состояния, которые считаются временными. Например:

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

Такие состояния не трактуются как ошибка до момента потери фокуса или вызова проверки полноты.

Это снижает жёсткость валидации и позволяет обрабатывать ввод как поток, а не как конечное значение.


Приоритеты обработки некорректного ввода

Внутренняя цепочка обработки выстраивается по уровням приоритета:

  1. definitions (фильтрация символов)
  2. onBeforeMask (нормализация входа)
  3. маска (структурное наложение)
  4. postValidation (логическая проверка)
  5. isValid / isComplete (финальная оценка)

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


Стратегии поведения при ошибках ввода

В зависимости от конфигурации система может применять разные стратегии:

Игнорирование

Некорректные символы не попадают в значение.

Автокоррекция

Символы приводятся к допустимому виду (регистр, формат, позиция).

Очистка

Полное удаление некорректного или неполного значения.

Частичное сохранение

Сохранение валидной части ввода с отбрасыванием остального.


Обработка массовых ошибок ввода

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

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

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


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

Некорректный ввод также возникает при конфликте:

  • перекрывающихся правил definitions
  • несовместимых частей маски
  • динамически изменяемых масок

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


Итоговая модель обработки ошибок ввода

Система Inputmask реализует не бинарную модель «валидно / невалидно», а многоуровневую фильтрацию с постепенным уточнением состояния. Некорректный ввод не фиксируется как ошибка в момент возникновения, а последовательно трансформируется через цепочку обработчиков до достижения допустимого состояния или полного исключения из результата.