Поведение при превышении лимитов

Библиотека AutoNumeric поддерживает механизм контроля допустимых значений. При вводе числа компонент постоянно проверяет, не выходит ли значение за установленные пределы. Основу этой системы составляют параметры:

  • minimumValue
  • maximumValue
  • overrideMinMaxLimits

Ограничения работают как при ручном вводе, так и при программном изменении значения через методы API.

new AutoNumeric('#price', {
    minimumValue: '0',
    maximumValue: '1000'
});

В этом примере поле не позволит выйти за диапазон от 0 до 1000.


Проверка диапазона при вводе

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

Например:

new AutoNumeric('#discount', {
    minimumValue: '0',
    maximumValue: '50'
});

Попытка ввести 60 приведёт к одному из вариантов поведения:

  • блокировка ввода;
  • временное разрешение значения;
  • автоматическая коррекция;
  • генерация ошибки.

Конкретный сценарий определяется настройкой overrideMinMaxLimits.


Параметр overrideMinMaxLimits

Этот параметр определяет реакцию AutoNumeric на превышение минимального или максимального значения.

Поддерживаются режимы:

Значение Поведение
ceiling запрещает превышение максимума
floor запрещает уменьшение ниже минимума
ignore игнорирует ограничения
invalid допускает ввод невалидного значения
doNotOverride использует стандартное поведение

Режим ceiling

Режим ceiling запрещает ввод значений выше maximumValue.

new AutoNumeric('#amount', {
    minimumValue: '0',
    maximumValue: '100',
    overrideMinMaxLimits: 'ceiling'
});

Если пользователь попытается ввести 150, библиотека:

  • либо заблокирует последнюю цифру;
  • либо автоматически вернёт значение к 100.

Поведение зависит от текущего состояния поля и способа ввода.

Особенности режима ceiling

Контроль только верхней границы

ceiling ориентирован исключительно на максимум.

minimumValue: '-100',
maximumValue: '100',
overrideMinMaxLimits: 'ceiling'

В этом случае:

  • 150 — запрещено;
  • -500 — может быть разрешено во время ввода.

Удобство для финансовых форм

Режим особенно полезен для:

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

Режим floor

floor действует противоположным образом — контролирует минимальное значение.

new AutoNumeric('#temperature', {
    minimumValue: '-20',
    maximumValue: '50',
    overrideMinMaxLimits: 'floor'
});

Попытка ввести значение ниже -20 будет отклонена.

Поведение режима

Значение Результат
-10 разрешено
-20 разрешено
-25 запрещено

Режим invalid

Режим invalid разрешает ввод значений вне диапазона, но помечает их как невалидные.

new AutoNumeric('#score', {
    minimumValue: '0',
    maximumValue: '100',
    overrideMinMaxLimits: 'invalid'
});

Теперь можно ввести 150, однако AutoNumeric будет считать значение некорректным.

Когда полезен invalid

Этот режим применяется в сложных интерфейсах, где:

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

Пример с последующей проверкой

const anElement = new AutoNumeric('#score', {
    minimumValue: '0',
    maximumValue: '100',
    overrideMinMaxLimits: 'invalid'
});

if (!anElement.isValid()) {
    console.log('Значение вне диапазона');
}

Режим ignore

ignore полностью отключает проверку диапазона.

new AutoNumeric('#freeInput', {
    minimumValue: '0',
    maximumValue: '100',
    overrideMinMaxLimits: 'ignore'
});

В этом режиме ограничения фактически перестают работать.

Что продолжает работать

Даже при ignore сохраняются:

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

Отключается только контроль диапазона.


Режим doNotOverride

doNotOverride использует внутреннее поведение библиотеки без принудительной коррекции.

new AutoNumeric('#nativeBehavior', {
    minimumValue: '0',
    maximumValue: '100',
    overrideMinMaxLimits: 'doNotOverride'
});

Это значение считается наиболее близким к базовой логике AutoNumeric.


Разница между invalid и ignore

Эти режимы часто путают.

invalid

  • ограничения существуют;
  • значение может стать невалидным;
  • API знает о нарушении диапазона;
  • возможна проверка через isValid().

ignore

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

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

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

new AutoNumeric('#payment', {
    minimumValue: '0',
    maximumValue: '5000',
    overrideMinMaxLimits: 'ceiling'
});

Если вставить:

10000

библиотека попытается:

  1. распарсить число;
  2. привести его к формату;
  3. проверить диапазон;
  4. применить выбранную стратегию ограничения.

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

Метод set() также учитывает лимиты.

anElement.set(2000);

Если максимум равен 1000, возможны варианты:

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

Это зависит от режима overrideMinMaxLimits.


Автоматическая коррекция значений

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

Пример

new AutoNumeric('#field', {
    minimumValue: '0',
    maximumValue: '100',
    overrideMinMaxLimits: 'ceiling'
});

Ввод:

150

может автоматически превратиться в:

100

Временные промежуточные значения

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

Например, при вводе -100:

  1. -
  2. -1
  3. -10
  4. -100

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

Проблема жёсткой блокировки

Слишком строгие ограничения могут мешать вводу:

minimumValue: '0'

При попытке начать ввод с - символ может быть немедленно удалён.


Влияние decimalPlaces

Количество десятичных знаков также влияет на контроль диапазона.

new AutoNumeric('#price', {
    minimumValue: '0',
    maximumValue: '10',
    decimalPlaces: 2
});

Примеры

Ввод Результат
9.99 допустимо
10.00 допустимо
10.01 превышение

Проверка отрицательных значений

AutoNumeric корректно работает с отрицательными диапазонами.

new AutoNumeric('#balance', {
    minimumValue: '-1000',
    maximumValue: '1000'
});

Допустимые значения

Значение Статус
-1000 допустимо
0 допустимо
1000 допустимо
1500 превышение

Работа с очень большими числами

Диапазоны могут задаваться строками высокой точности.

new AutoNumeric('#bigNumber', {
    minimumValue: '-999999999999999.99',
    maximumValue: '999999999999999.99'
});

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


Использование событий для обработки превышений

AutoNumeric поддерживает события, позволяющие реагировать на нарушения диапазона.

Пример

const field = document.querySelector('#amount');

field.addEventListener('autoNumeric:invalidValue', (event) => {
    console.log('Недопустимое значение');
});

Возможные сценарии

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

Комбинация с пользовательской валидацией

AutoNumeric отвечает только за числовой диапазон и форматирование. Бизнес-логика обычно добавляется отдельно.

const value = anElement.getNumber();

if (value > userBalance) {
    console.log('Недостаточно средств');
}

Типичные ошибки настройки ограничений

Использование чисел вместо строк

Неправильно:

maximumValue: 1000

Правильно:

maximumValue: '1000'

AutoNumeric ожидает строковые значения.


minimumValue больше maximumValue

minimumValue: '100',
maximumValue: '0'

Такая конфигурация приводит к ошибкам и некорректной работе.


Неверный формат чисел

Плохо:

maximumValue: '1,000'

Правильно:

maximumValue: '1000'

Конфигурационные значения задаются без форматирования.


Практический пример ограничения суммы платежа

new AutoNumeric('#paymentAmount', {
    currencySymbol: '$',
    decimalCharacter: '.',
    digitGroupSeparator: ',',
    minimumValue: '1',
    maximumValue: '10000',
    overrideMinMaxLimits: 'ceiling'
});

Что обеспечивает такая конфигурация

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

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

new AutoNumeric('#percentage', {
    minimumValue: '0',
    maximumValue: '100',
    overrideMinMaxLimits: 'invalid'
});

Такой подход удобен в интерфейсах с:

  • серверной проверкой;
  • отложенной валидацией;
  • сложными формами;
  • массовым редактированием данных.

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

Пустое значение не считается превышением диапазона.

new AutoNumeric('#optionalField', {
    minimumValue: '0',
    maximumValue: '100',
    emptyInputBehavior: 'null'
});

Пока поле пустое:

  • минимальное значение не применяется;
  • ошибки диапазона не возникают;
  • значение может считаться null.

Проверка валидности через API

Метод isValid()

if (anElement.isValid()) {
    console.log('Корректное значение');
}

Метод getNumericString()

const raw = anElement.getNumericString();

Возвращает числовую строку без форматирования.

Метод getNumber()

const number = anElement.getNumber();

Возвращает обычное число JavaScript.


Архитектурные особенности системы ограничений

Система проверки диапазонов в AutoNumeric построена вокруг нескольких этапов:

  1. получение сырого ввода;
  2. удаление форматирования;
  3. преобразование в числовую строку;
  4. проверка минимального значения;
  5. проверка максимального значения;
  6. применение режима overrideMinMaxLimits;
  7. повторное форматирование;
  8. обновление DOM.

Такой подход позволяет библиотеке одновременно:

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