DOM события форм
События форм позволяют JavaScript реагировать на заполнение, изменение и отправку HTML-форм — это основа клиентской валидации и интерактивных интерфейсов ввода.
Зачем нужно
Без обработки событий форм нельзя реализовать валидацию на лету, поисковые подсказки, автосохранение черновиков или перехват отправки для AJAX-запроса. События форм покрывают весь цикл взаимодействия пользователя с вводом: фокус → ввод → изменение → отправка.
Где используется
- Клиентская валидация перед отправкой (
submit) - Поиск с автодополнением (
inputна поле поиска) - Отправка форм через fetch без перезагрузки страницы
- Маски ввода и форматирование телефонов, карт (
input) - Фиксация ухода из поля для показа ошибки (
blur) - Зависимые поля (тип доставки → адрес) через
change
Основной контент
Основные события
| Событие | Когда срабатывает |
|---|---|
submit |
Форма отправлена (кнопка или Enter) |
input |
Значение поля изменилось (каждый символ) |
change |
Значение зафиксировалось (после blur или для select/checkbox) |
focus |
Поле получило фокус |
blur |
Поле потеряло фокус |
reset |
Форма сброшена в начальное состояние |
focusin |
Фокус (всплывает, в отличие от focus) |
focusout |
Потеря фокуса (всплывает) |
Перехват отправки
const form = document.querySelector('#signup-form');
form.addEventListener('submit', (e) => {
e.preventDefault(); // отменяем перезагрузку страницы
const data = new FormData(form);
const email = data.get('email');
if (!email.includes('@')) {
showError('Введите корректный email');
return;
}
fetch('/api/signup', {
method: 'POST',
body: data,
}).then(/* ... */);
});
Событие input — реакция на ввод
const search = document.querySelector('#search');
search.addEventListener('input', (e) => {
const query = e.target.value.trim();
if (query.length > 2) {
fetchSuggestions(query);
}
});
Событие change
const select = document.querySelector('#country');
select.addEventListener('change', (e) => {
const country = e.target.value;
loadCities(country); // загрузить города для выбранной страны
});
// Для чекбокса
const checkbox = document.querySelector('#agree');
checkbox.addEventListener('change', () => {
submitBtn.disabled = !checkbox.checked;
});
Focus и blur — валидация по уходу
const emailInput = document.querySelector('#email');
const error = document.querySelector('#email-error');
emailInput.addEventListener('blur', () => {
if (!emailInput.value.includes('@')) {
error.textContent = 'Введите корректный email';
emailInput.classList.add('invalid');
} else {
error.textContent = '';
emailInput.classList.remove('invalid');
}
});
FormData — сбор всех значений
const form = document.querySelector('form');
const data = new FormData(form);
data.get('username'); // одно поле по name
data.getAll('tags'); // массив (для multiple select, checkbox-группы)
Object.fromEntries(data); // в обычный объект
// Отправить как JSON
fetch('/api', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify(Object.fromEntries(data)),
});
Частые ошибки
- Не вызывают
e.preventDefault()приsubmit— форма отправляется с перезагрузкой страницы, AJAX-логика не работает. - Используют
changeвместоinputдля поиска —changeсрабатывает только после потери фокуса, поисковые подсказки не обновляются в реальном времени. - Забывают
nameна полях —FormDataсобирает только поля с атрибутомname; без него данные будут пустыми. - Вешают
submitна кнопку вместо формы — если пользователь нажимает Enter в текстовом поле, кнопка не получит событиеclick, ноformполучитsubmit.