WS Form

WS 0.99

WS Form предоставляет единый интерфейс для чтения и изменения полей HTML-формы, проверки значений и обработки отправки.

Поддерживает

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

Подключение

js
import { wsForm } from '/core/modules/ws-form/assets/js/initial.js';

Быстрый старт

html
<form id="contact-form">
    <label>
        Имя
        <input type="text" name="name">
    </label>
    <button type="submit">Отправить</button>
</form>
js
const form = wsForm(document.querySelector('#contact-form'));

form.required('name', 'Укажите имя');

form.onSubmit(({ values, valid }) => {
    if (!valid) {
        return;
    }

    console.log(values.name);
}, {
    validate: true,
    prevent: true
});

wsForm() принимает элемент <form> и возвращает объект для работы с формой. Параметр validate: true включает проверку при отправке; без него обработчик получает valid: true без запуска проверки. Параметр prevent: true отменяет стандартную отправку браузером. По умолчанию она не отменяется.

Шаблоны ввода

Готовые шаблоны доступны через form.templates. Каждый метод принимает name существующего поля и необязательный объект настроек, а возвращает объект формы. Шаблон не создаёт HTML-поле: сначала добавьте его в <form> с нужным атрибутом name.

Шаблон Что делает
email(name, options) Проверяет формат адреса электронной почты.
login(name, options) Допускает логин или адрес электронной почты.
password(name, options) Проверяет пароль; по умолчанию длина от 8 до 99 символов.
number(name, options) Оставляет только цифры при вводе и проверяет их при валидации.
phone(name, options) Форматирует международный номер телефона и проверяет его длину.
slug(name, options) Нормализует адресную часть и при необходимости синхронизирует её с другим полем.
date(name, options) Добавляет к полю календарь выбора даты.

Email, логин и пароль

js
form.templates.email('email', {
    required: true,
    requiredMessage: 'Укажите почту',
    patternMessage: 'Некорректный адрес'
});

form.templates.login('login', {
    required: true,
    min: 3,
    max: 50
});

form.templates.password('password', {
    required: true,
    min: 8,
    max: 64
});

Для этих шаблонов required по умолчанию выключен. У password значения min и max по умолчанию равны 8 и 99; их можно изменить. Для email и login длина не ограничивается, пока не заданы min или max. Тексты ошибок можно переопределять параметрами requiredMessage, minMessage, maxMessage и patternMessage.

Число и телефон

js
form.templates.number('code', {
    required: true,
    max: 6
});

form.templates.phone('phone', {
    required: true,
    mask: '+375 (__) ___-__-__',
    min: 12,
    max: 12
});

number работает со строкой цифр, а не преобразует значение поля в тип number. Его max ограничивает количество цифр.

У phone символ _ обозначает позицию для вводимой цифры; параметром digit его можно заменить. Маска должна начинаться с +. Параметры min и max задают длину полного номера **в цифрах**, включая фиксированные цифры маски. form.value('phone') возвращает номер без пробелов и скобок, например +375291234567. Без маски поддерживается международный номер длиной от 3 до 15 цифр.

Адресная часть

js
form.templates.slug('slug', {
    origin: 'title',
    slash: false
});

При изменении title шаблон обновляет slug: приводит текст к нижнему регистру, заменяет пробелы дефисами и по умолчанию транслитерирует кириллицу. slash: false запрещает / в результате; cyrillic: true сохраняет кириллицу. Если задан toggle, синхронизация зависит от состояния соответствующего флажка.

Дата

js
form.templates.date('published-at', {
    time: true
});

Шаблон добавляет календарь к существующему полю. Без time значение имеет формат YYYY-MM-DD, с time: true — YYYY-MM-DD HH:MM:SS. Язык календаря можно передать при создании формы: wsForm(formNode, { lang: 'ru' }). Для оформления календаря передайте { style: true } при создании формы: модуль подключит свой CSS.

Значения полей

Имя поля соответствует его HTML-атрибуту name.

Метод Назначение
has(name) Проверить наличие поля с указанным именем.
value(name) Получить значение одного поля.
setValue(name, value) Установить значение одного поля.
values() Получить объект значений всех полей формы.
setValues(values) Установить значения существующих полей из объекта.
clear(name) Очистить одно поле.
clearAll() Очистить все поля.
js
form.setValue('name', 'Анна');

console.log(form.value('name'));
console.log(form.values());

Для текстового поля значение является строкой. Одиночный флажок возвращает true или false, группа флажков — массив значений выбранных элементов, группа радиокнопок — значение выбранного элемента либо пустую строку. Поле выбора файла возвращает массив объектов File; назначить ему файлы через setValue() нельзя.

Группы полей

Несколько радиокнопок или флажков с одинаковым name обрабатываются как одно поле. Для группы флажков в setValue() передавайте массив строк:

html
<form id="preferences-form">
    <label><input type="checkbox" name="topics[]" value="news"> Новости</label>
    <label><input type="checkbox" name="topics[]" value="updates"> Обновления</label>
</form>
js
const preferences = wsForm(document.querySelector('#preferences-form'));

preferences.setValue('topics[]', ['news', 'updates']);
console.log(preferences.value('topics[]')); // ['news', 'updates']

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

Проверка значений

Метод Назначение
required(name, message) Сделать поле обязательным и задать сообщение об ошибке.
minLength(name, min, message) Проверять минимальную длину текста.
maxLength(name, max, message) Проверять максимальную длину текста.
pattern(name, expression, message) Проверять текст регулярным выражением.
validate(name) Проверить указанное поле; без name — зарегистрированные поля формы.
errors(name) Получить массив ошибок поля после проверки.
resetValidation(name) Сбросить ошибки указанного поля; без name — зарегистрированных полей.
js
form.required('name', 'Укажите имя');
form.minLength('name', 2, 'Имя слишком короткое');

if (!form.validate('name')) {
    console.log(form.errors('name'));
}

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

Отображение ошибок

WS Form хранит ошибки полей, но не создаёт для них HTML-разметку. Вывод сообщений остаётся за кодом вашей формы.

Добавьте место для сообщения рядом с полем name:

html
<p id="name-error" role="alert"></p>

Если сервер вернул ошибку для этого поля, передайте её как массив строк:

js
const nameError = document.querySelector('#name-error');

form.setErrors({
    name: ['Имя уже используется']
});

nameError.textContent = form.firstError('name');
form.focusFirstError();

setErrors() принимает объект, где ключи — имена существующих полей, а значения — массивы сообщений. firstError(name) возвращает первое сообщение или пустую строку. hasErrors() позволяет проверить, есть ли ошибки у доступных полей.

Для сброса сообщения очистите и состояние формы, и выведенный текст:

js
form.clearErrors('name');
nameError.textContent = '';

clearErrors(name) не меняет HTML самостоятельно. Повторный вызов validate() также сбрасывает ранее установленные ошибки и запускает правила проверки заново, поэтому не вызывайте его сразу после setErrors(), если хотите показать ответ сервера.

Отправка и завершение работы

onSubmit(handler, options) регистрирует обработчик события submit. Он получает объект с event, экземпляром form, объектом values и результатом valid. Опция validate: true запускает проверку. При ошибке по умолчанию отменяется стандартная отправка и фокус переходит к первому ошибочному полю; это поведение можно изменить параметрами preventInvalid: false и focusError: false.

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