Работа с числовыми форматированными полями в веб-приложениях требует строгого соблюдения принципов доступности, поскольку любое вмешательство в отображение значения может повлиять на интерпретацию данных вспомогательными технологиями. Библиотека AutoNumeric, выполняющая автоматическое форматирование чисел (разделители тысяч, валютные символы, фиксированные десятичные знаки), должна интегрироваться таким образом, чтобы не нарушать требования WCAG 2.1/2.2.
Ключевая проблема заключается в различии между визуальным представлением значения и его семантическим содержимым, которое воспринимается скринридерами. Любое изменение DOM-значения input может приводить к рассинхронизации между тем, что видит пользователь, и тем, что озвучивает вспомогательная технология.
HTML-элемент <input> с типом text или
tel часто используется для числовых значений при применении
AutoNumeric, поскольку стандартный type="number"
конфликтует с форматированием (например, не допускает пробелы или
валютные символы).
Для обеспечения доступности необходимо сохранять корректную семантику:
role="textbox" (явно или по умолчанию)aria-live не должен применяться к полю ввода
напрямуюvalue должно оставаться валидным числом без
визуальных разделителей в доступной модели данныхAutoNumeric при этом изменяет отображаемое значение, но не должен ломать логическую структуру поля.
Пример инициализации:
new AutoNumeric('#amount', {
digitGroupSeparator: ' ',
decimalCharacter: ',',
currencySymbol: '₸ ',
unformatOnSubmit: true
});
В контексте WCAG критично разделение:
Нарушение возникает, когда AutoNumeric записывает форматированное
значение в value, например:
1 234 567,89
Вспомогательные технологии могут интерпретировать это как текстовую строку, а не число.
Решение заключается в использовании механизма хранения «сырых» данных:
getNumericString()getNumber()unformat()и обязательной синхронизации перед отправкой формы.
Для обеспечения соответствия WCAG 1.3.1 (информация и отношения) и 4.1.2 (имя, роль, значение), поле должно быть явно описано:
<label for="amount">Сумма</label>
<input id="amount" type="text" aria-describedby="amount-hint amount-error">
<div id="amount-hint">Введите сумму в тенге</div>
<div id="amount-error" aria-live="polite"></div>
AutoNumeric не должен удалять или перезаписывать aria-*
атрибуты при форматировании.
Особое внимание:
aria-describedby должен сохраняться неизменнымaria-invalid должен устанавливаться при ошибках
валидацииaria-live используется только для внешних сообщений, не
для inputПри интеграции с валидацией необходимо синхронизировать состояние поля:
function validateAmount(anElement) {
const value = anElement.getNumber();
const isValid = value >= 0 && value <= 1000000;
const input = document.querySelector('#amount');
if (!isValid) {
input.setAttribute('aria-invalid', 'true');
} else {
input.removeAttribute('aria-invalid');
}
}
WCAG требует, чтобы ошибка:
aria-describedbyОдним из критических аспектов является взаимодействие AutoNumeric с кареткой ввода.
WCAG 2.1.1 (Keyboard) требует, чтобы все функции были доступны с клавиатуры. AutoNumeric может нарушать UX при:
input событииПравильное поведение включает:
При каждом вводе символа AutoNumeric может триггерить обновление значения, что приводит к повторным озвучиваниям скринридером.
Это нарушает WCAG 1.3.2 (Meaningful Sequence) и 4.1.3 (Status Messages), если обновления слишком частые.
Рекомендуемые подходы:
aria-live="polite" только для итоговых
сообщенийДля улучшения доступности на мобильных устройствах применяется:
<input id="amount" type="text" inputmode="decimal">
или:
inputmode="numeric"
Это обеспечивает корректную клавиатуру без потери поддержки форматирования AutoNumeric.
Важно, что type="number" не используется, поскольку:
Вставка текста является важным сценарием WCAG, так как альтернативные устройства ввода часто используют буфер обмена.
AutoNumeric должен:
Пример обработки:
element.addEventListener('paste', (e) => {
setTimeout(() => {
element.setAttribute('aria-invalid', String(!element.checkValidity?.()));
}, 0);
});
Хотя AutoNumeric не управляет стилями напрямую, форматирование может усиливать проблемы восприятия:
WCAG 1.4.3 (Contrast Minimum) и 1.4.1 (Use of Color) требуют:
При использовании AutoNumeric внутри форм критично разделение:
Типичная схема:
const an = new AutoNumeric('#amount', { unformatOnSubmit: true });
form.addEventListener('submit', () => {
const numeric = an.getNumber();
hiddenInput.value = numeric;
});
Это предотвращает отправку локализованных строк, которые могут быть неправильно интерпретированы сервером или вспомогательными системами.
При изменении значения извне (например, пересчёт суммы):
innerTextaria-live применяется только к статусным блокам<div aria-live="polite" id="status"></div>
AutoNumeric не должен напрямую взаимодействовать с live regions, чтобы избежать дублирования озвучивания.
Некорректные вводы (например, несколько десятичных разделителей) должны:
WCAG 3.3.1 (Error Identification) требует явной идентификации ошибки, а не скрытой коррекции.
Основные риски при интеграции AutoNumeric:
Корректная интеграция строится вокруг принципа: