Интеграция с HTML-формами при использовании библиотеки validator.js строится вокруг принципа явной проверки значений полей до отправки данных на сервер. Основная идея заключается в том, что значения из DOM извлекаются, проходят набор правил валидации и только затем допускаются к дальнейшей обработке.
Подключение библиотеки в клиентском приложении может выполняться через npm или CDN:
npm install validator
Либо через модульную систему:
import validator from 'validator';
После подключения библиотека используется как набор чистых функций, не зависящих от DOM. Это позволяет разделять логику валидации и представление формы.
HTML-форма выступает источником сырых данных, которые требуют нормализации и проверки:
<form id="registrationForm">
<input type="text" name="email" />
<input type="password" name="password" />
<button type="submit">Отправить</button>
</form>
Извлечение значений обычно выполняется через
FormData:
const form = document.getElementById('registrationForm');
form.addEventListener('submit', (event) => {
event.preventDefault();
const data = new FormData(form);
const email = data.get('email');
const password = data.get('password');
});
На этом этапе данные остаются необработанными, включая пробелы, регистр и потенциальные ошибки ввода.
Одним из наиболее распространённых сценариев является проверка email:
import validator from 'validator';
const isEmailValid = validator.isEmail(email);
Функция isEmail проверяет соответствие стандартному
формату адреса электронной почты. Важно учитывать, что проверка
выполняется только на уровне синтаксиса, без обращения к почтовому
серверу.
Дополнительные проверки строк:
validator.isLength(password, { min: 8 });
validator.isAlphanumeric(password);
Комбинация правил позволяет формировать многоуровневую систему валидации.
HTML-форма обычно блокируется до завершения валидации:
form.addEventListener('submit', (event) => {
event.preventDefault();
const data = new FormData(form);
const email = data.get('email');
const password = data.get('password');
const errors = {};
if (!validator.isEmail(email)) {
errors.email = 'Некорректный email';
}
if (!validator.isLength(password, { min: 8 })) {
errors.password = 'Пароль слишком короткий';
}
if (Object.keys(errors).length === 0) {
form.submit();
}
});
Такой подход позволяет централизовать контроль отправки и исключить попадание некорректных данных в бизнес-логику.
Связь между Validator.js и DOM реализуется через отображение состояния ошибок:
function showError(fieldName, message) {
const errorElement = document.querySelector(`.error-${fieldName}`);
errorElement.textContent = message;
}
Использование структурированной модели ошибок упрощает масштабирование формы:
if (!validator.isEmail(email)) {
showError('email', 'Некорректный email');
} else {
showError('email', '');
}
Проверка данных может выполняться не только при отправке формы, но и при вводе:
const emailInput = document.querySelector('input[name="email"]');
emailInput.addEventListener('input', (e) => {
const value = e.target.value;
if (!validator.isEmail(value)) {
showError('email', 'Email введён неверно');
} else {
showError('email', '');
}
});
Такой режим снижает количество ошибок на этапе отправки и улучшает интерактивность интерфейса.
Перед проверкой часто выполняется очистка входных значений:
const normalizedEmail = validator.trim(validator.normalizeEmail(email));
Удаление лишних пробелов и приведение к стандартному виду повышает точность проверок.
Несмотря на широкий набор функций, часто требуется расширение логики:
function isStrongPassword(value) {
return (
validator.isLength(value, { min: 10 }) &&
/[A-Z]/.test(value) &&
/[0-9]/.test(value)
);
}
Validator.js в таких сценариях используется как базовый слой, а дополнительные проверки реализуются через JavaScript.
При работе с формами среднего и большого размера логика структурируется:
function validateForm(data) {
return {
email: validator.isEmail(data.email) ? null : 'Ошибка email',
password: validator.isLength(data.password, { min: 8 })
? null
: 'Слабый пароль',
};
}
Результат представляет собой объект ошибок, который легко сопоставляется с полями DOM.
Состояние формы часто хранится отдельно от DOM:
const state = {
email: '',
password: '',
errors: {},
};
Обновление состояния происходит при каждом изменении:
state.email = emailInput.value;
state.errors = validateForm(state);
Это позволяет отделить логику валидации от представления.
HTML5-атрибуты могут использоваться совместно с Validator.js:
<input type="email" required minlength="5" />
Однако встроенная валидация браузера часто недостаточно гибкая, поэтому Validator.js применяется как основной механизм контроля:
if (!validator.isEmail(input.value)) {
input.setCustomValidity('Некорректный email');
} else {
input.setCustomValidity('');
}
При наличии взаимосвязанных полей (например, подтверждение пароля) логика усложняется:
if (password !== confirmPassword) {
errors.confirmPassword = 'Пароли не совпадают';
}
Validator.js используется для отдельных полей, а межполевые зависимости обрабатываются вручную.
При интенсивной валидации применяется debounce:
function debounce(fn, delay) {
let timer;
return (...args) => {
clearTimeout(timer);
timer = setTimeout(() => fn(...args), delay);
};
}
И затем:
emailInput.addEventListener('input', debounce(validateEmail, 300));
Это снижает количество вызовов функций валидации при наборе текста.
Если поля добавляются динамически, валидация строится через делегирование событий:
form.addEventListener('input', (event) => {
const { name, value } = event.target;
if (name === 'email') {
if (!validator.isEmail(value)) {
showError('email', 'Ошибка');
}
}
});
Такой подход масштабируется на формы с неизвестным количеством полей.
Для крупных приложений правила выносятся в отдельный модуль:
export const rules = {
email: (value) => validator.isEmail(value),
password: (value) => validator.isLength(value, { min: 8 }),
};
Это обеспечивает единообразие логики проверки во всех формах приложения.