$ sudo teach IT
МОДУЛЬ 9 · УРОК 7

Формы и пользовательский ввод

Формы — главный способ получить информацию от пользователя. Логин, поиск, добавление задачи — везде форма. Научимся читать значения полей, перехватывать отправку и проверять данные до того, как их куда-то отправить.

⏱ ~25 минут 🎓 Новичок 🌐 DOM API

📝 Читаем и записываем значения полей

Текстовое поле <input> — это DOM-элемент. Его текущее значение хранится в свойстве .value. Можно как прочитать (что ввёл пользователь), так и записать (подставить значение программно).

const input = document.querySelector('#nameInput');

// Читаем значение
console.log(input.value); // что сейчас в поле

// Записываем значение
input.value = 'Иван';  // подставляем текст

// Очищаем поле
input.value = '';

// Trim убирает лишние пробелы по краям
const clean = input.value.trim();

💡 Всегда используй .trim()! Пользователи часто случайно добавляют пробелы в начале или конце. ' Иван '.trim() → 'Иван'. Это защищает от пустых «белых» значений.

🎛️ Типы полей и как с ними работать

Разные типы полей — разный способ получить значение.

text, number, email

Значение всегда строка, даже для type="number"!

input.value // строка
checkbox

Используй .checked — булево (true/false)

checkbox.checked // true или false
radio

Найди активный через :checked

document.querySelector(
  'input[name="color"]:checked'
).value
select

Тоже .value — выбранный option

select.value // выбранное значение
// Чтение разных типов полей
const textInput = document.querySelector('#name');
const numberInput = document.querySelector('#age');
const checkbox = document.querySelector('#agree');

console.log(textInput.value);       // строка: 'Иван'
console.log(numberInput.value);     // СТРОКА: '25' (не число!)
console.log(Number(numberInput.value)); // число: 25
console.log(checkbox.checked);      // boolean: true или false

📤 Событие submit и preventDefault

Когда пользователь нажимает кнопку «Отправить» или Enter в поле формы — срабатывает событие submit. По умолчанию браузер отправляет форму и перезагружает страницу. Нам это почти никогда не нужно в современных приложениях — поэтому всегда вызываем event.preventDefault().

const form = document.querySelector('#myForm');

form.addEventListener('submit', (event) => {
  event.preventDefault(); // отменяем стандартную отправку!

  // Теперь читаем данные и делаем что нужно
  const name = form.querySelector('#name').value.trim();
  const email = form.querySelector('#email').value.trim();

  console.log('Имя:', name);
  console.log('Email:', email);
});

💡 Совет: обработчик submit лучше вешать на <form>, а не на кнопку. Так он сработает и при нажатии кнопки, и при нажатии Enter в поле.

🛡️ Валидация перед отправкой

Валидация — проверка данных на корректность перед отправкой. Это защищает сервер от мусора и помогает пользователю заполнить форму правильно.

form.addEventListener('submit', (event) => {
  event.preventDefault();

  const name = document.querySelector('#name').value.trim();
  const age = Number(document.querySelector('#age').value);
  const agree = document.querySelector('#agree').checked;

  // Массив ошибок
  const errors = [];

  if (name.length < 2) {
    errors.push('Имя должно содержать минимум 2 символа');
  }

  if (isNaN(age) || age < 0 || age > 120) {
    errors.push('Введите корректный возраст (0–120)');
  }

  if (!agree) {
    errors.push('Необходимо принять условия');
  }

  if (errors.length > 0) {
    // Показываем ошибки пользователю
    const errorBlock = document.querySelector('#errors');
    errorBlock.innerHTML = errors.map(e => `<p>${e}</p>`).join('');
    return; // прекращаем выполнение
  }

  // Всё ок — отправляем данные
  console.log('Данные валидны, отправляем:', { name, age });
});

💻 Полный пример: форма добавления задачи

// HTML:
// <form id="taskForm">
//   <input type="text" id="taskInput" placeholder="Задача..." />
//   <select id="priority">
//     <option value="low">Низкий</option>
//     <option value="high">Высокий</option>
//   </select>
//   <button type="submit">Добавить</button>
// </form>
// <ul id="taskList"></ul>

const form = document.querySelector('#taskForm');
const taskInput = document.querySelector('#taskInput');
const prioritySelect = document.querySelector('#priority');
const taskList = document.querySelector('#taskList');

form.addEventListener('submit', (event) => {
  event.preventDefault();

  const text = taskInput.value.trim();
  const priority = prioritySelect.value;

  if (!text) {
    taskInput.style.borderColor = 'rgba(220, 50, 50, 1)';
    return;
  }

  taskInput.style.borderColor = '';

  // Создаём элемент задачи
  const li = document.createElement('li');
  li.textContent = `[${priority}] ${text}`;

  const deleteBtn = document.createElement('button');
  deleteBtn.textContent = '✕';
  deleteBtn.addEventListener('click', () => li.remove());

  li.appendChild(deleteBtn);
  taskList.prepend(li); // новые задачи — сверху

  // Сброс формы
  form.reset(); // сбрасывает все поля формы
  taskInput.focus();
});

✅ Итоги урока

  • input.value — значение текстового поля (всегда строка)
  • checkbox.checked — состояние чекбокса (true/false)
  • Для number-поля значение всегда строка — конвертируй через Number()
  • Событие submit — вешается на <form>, срабатывает при отправке
  • event.preventDefault() — обязателен в submit, иначе страница перезагрузится
  • Валидация: проверяем данные, собираем ошибки, показываем пользователю
  • form.reset() — удобный метод для сброса всех полей формы
  • Всегда используй .trim() для текстовых полей

Раздел 9 завершён — ты освоил DOM! В следующем разделе разберём асинхронность: что такое event loop, setTimeout и как работают промисы. 🚀

Формы и пользовательский ввод

7 вопросов

Валидация формы

// Дан элемент form (тег ). // Напишите обработчик события 'submit', который: // 1. Отменяет стандартное поведение формы // 2. Читает значения полей: nameInput, emailInput // 3. Если name меньше 2 символов — показывает ошибку в errorBlock // 4. Если email не содержит '@' — показывает ошибку в errorBlock // 5. Если всё ок — выводит в resultBlock 'Форма отправлена' const form = null; const nameInput = null; const emailInput = null; const errorBlock = null; const resultBlock = null; // Ваш код здесь

Чтение чекбокса и select

// Даны элементы: agreeCheckbox (checkbox), citySelect (select), // form (тег ), resultBlock. // Напишите обработчик submit на form, который: // 1. Отменяет стандартное поведение // 2. Если agreeCheckbox не отмечен — показывает 'Согласитесь с условиями' // 3. Иначе — выводит 'Выбран город: ' + значение из citySelect const form = null; const agreeCheckbox = null; const citySelect = null; const resultBlock = null; // Ваш код здесь