isComplete проверка

В библиотеке Inputmask проверка полноты введённого значения опирается на строгое соответствие текущего состояния поля заданной маске. Механизм isComplete используется для определения того, заполнены ли все обязательные позиции маски корректными символами и не остались ли незаполненные обязательные элементы или незавершённые блоки ввода.

Состояние «полностью заполнено» в Inputmask не сводится к простой проверке длины строки. Маска может содержать:

  • обязательные символы (9, a, *)
  • литералы (дефисы, скобки, пробелы)
  • условные или необязательные блоки
  • повторяющиеся группы ({} квантификаторы)
  • альтернативные ветвления

Поэтому isComplete работает не как строковая валидация, а как анализ состояния внутреннего буфера маски.

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


Поведение isComplete в Inputmask

Метод isComplete вызывается у экземпляра маски:

const mask = new Inputmask("99-99-9999").mask(input);
const result = mask.isComplete();

Возвращаемое значение:

  • true — все обязательные позиции заполнены
  • false — есть хотя бы один незаполненный или некорректный слот

Важно, что isComplete не проверяет бизнес-валидность (например, допустимость даты), а только структурную завершённость.


Различие между isComplete и isValid

Внутренне Inputmask оперирует несколькими уровнями проверки:

  • isComplete — проверка заполненности маски
  • isValid — проверка соответствия значений правилам маски
  • hasMaskedValue — наличие маскированного значения
  • isFullValue (в некоторых конфигурациях) — полное значение с учётом литералов

isComplete является более узким понятием, чем isValid.

Пример различия:

const mask = new Inputmask("99/99");

input.value = "12/3_";
mask.isComplete(); // false
mask.isValid();    // может быть false или true в зависимости от режима

Даже если часть символов допустима, незаполненный слот делает значение неполным.


Внутренний механизм определения полноты

Inputmask хранит внутреннее представление введённых данных в виде буфера, где каждая позиция соответствует элементу маски. При вызове isComplete происходит обход этого буфера.

Упрощённая логика выглядит следующим образом:

  1. Получить текущие значения всех позиций маски

  2. Проверить каждую позицию:

    • если позиция обязательная → должна содержать допустимый символ
    • если позиция литерал → должна совпадать с эталоном
  3. Если найден хотя бы один незаполненный обязательный слот → вернуть false

  4. Иначе вернуть true

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


Роль placeholder и пустых значений

Placeholder в Inputmask используется только как визуальный индикатор. Он не влияет на результат isComplete.

Пример:

const mask = new Inputmask("99-99");
input.value = "12-_3";
mask.isComplete(); // false

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


Поведение при optional и greedy масках

Маски с необязательными блоками изменяют поведение проверки.

Пример:

(99) 999-9999

Если часть (99) является опциональной, то isComplete может вернуть true, даже если этот блок не заполнен, при условии что остальные обязательные части корректны.

При этом важно учитывать параметры:

  • optionalmarker
  • greedy
  • skipOptionalPartCharacter

Эти настройки влияют на то, какие части считаются обязательными для завершённости.


Квантификаторы и их влияние

При использовании повторяющихся блоков:

9{1,3}

Inputmask ожидает минимум один символ и максимум три. В этом случае:

  • 1 символ → может считаться complete
  • 2 символа → complete
  • 0 символов → not complete

Таким образом, isComplete зависит от минимальной границы квантификатора, а не от максимальной.


Влияние динамических масок

При использовании динамических масок поведение isComplete зависит от текущего состояния ветки маски.

Пример:

"9", "99", "999"

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

Это означает:

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

Связь с событиями complete и incomplete

Хотя isComplete — это метод проверки состояния, он тесно связан с событиями:

  • oncomplete
  • onincomplete

Механизм работает следующим образом:

  • после каждого ввода Inputmask пересчитывает состояние
  • если isComplete становится true → триггерится oncomplete
  • если состояние переходит в false → триггерится onincomplete

Таким образом, isComplete является базовым критерием для событийной модели завершённости.


Проверка через inputmask instance

В типичной реализации проверка выполняется через экземпляр маски:

const im = new Inputmask("99-99-9999").mask(input);

if (im.isComplete()) {
  // значение полностью введено
}

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


Частые причины false результата

isComplete может возвращать false даже при визуально «заполненном» поле в следующих случаях:

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

Особенно часто ошибка возникает при масках с несколькими уровнями вложенности.


Влияние очищенных значений

Если поле было очищено программно:

input.value = "";

или через API:

im.setValue("");

то isComplete немедленно становится false, так как внутренний буфер сбрасывается до пустого состояния.


Особенности работы в режиме autoUnmask

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

Это означает:

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

Поведение при масках с regex

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

{regex: "[0-9a-z]"}

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


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

isComplete применяется в сценариях, где требуется строгий контроль завершённости ввода:

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

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


Особенности асинхронного ввода

При программном изменении значения важно учитывать, что состояние isComplete обновляется синхронно после обработки input-событий. При прямом изменении value без триггера событий результат может временно не совпадать с визуальным состоянием до пересчёта маски.


Взаимодействие с removeMaskOnSubmit

При включённой опции удаления маски при отправке формы:

  • isComplete оценивается до удаления маски
  • итоговое значение может отличаться от отображаемого
  • завершённость определяется по структуре, а не по финальному raw value

Итоговая логика поведения

Состояние isComplete формируется как результат строгой структурной проверки:

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

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