Перейти к содержимому

JavaScript FormData

В современной веб-разработке эффективная обработка данных форм критически важна для создания динамичного и интерактивного пользовательского опыта. JavaScript предоставляет мощный инструмент для управления данными форм через API FormData. В этом руководстве мы подробно разберем FormData, изучим его возможности, синтаксис и лучшие практики внедрения.

Что такое FormData

FormData — это встроенный объект JavaScript, который позволяет захватывать данные формы и преобразовывать их в формат пар «ключ-значение». Он упрощает процесс сбора информации из HTML-форм и отправки их на сервер асинхронно с помощью fetch API.

Создание объектов FormData

Чтобы создать объект FormData, просто создайте его экземпляр с помощью конструктора FormData(). Вы также можете просмотреть всё содержимое экземпляра FormData, вызвав метод entries. Метод возвращает объект-итератор, где каждый элемент содержит ключ и значение:


html
<script>
  function onSubmit(event) {
    event.preventDefault();
    const form = document.getElementById('myForm');
    const formData = new FormData(form);
    let results = '';
    for (const [key, value] of formData.entries()) {
      results += `${key}: ${value}\n`;
    }
    alert(results)
  }
</script>
<form id="myForm" onsubmit="onSubmit(event)">
  <input type="text" name="username" value="John Doe" />
  <input type="email" name="email" value="[email protected]" />
  <input type="submit" />
</form>

Доступ к данным формы

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


html
<form id="myForm" onsubmit="onSubmit(event)">
  <input type="text" name="username" value="John Doe" />
  <input type="email" name="email" value="[email protected]" />
  <input type="submit" />
</form>
<script>
  function onSubmit(event) {
    const form = document.getElementById('myForm');
    const formData = new FormData(form);
    const username = formData.get('username');
    const email = formData.get('email');
    alert(`username: ${username}; email: ${email}`);
  }
</script>

Отправка FormData с помощью Fetch API

Одним из самых распространенных вариантов использования FormData является асинхронная отправка данных формы на сервер. Мы можем легко реализовать это с помощью Fetch API:


html
<form id="myForm" onsubmit="onSubmit(event)">
  <input type="text" name="title" value="A title" />
  <input type="text" name="body" value="A body" />
  <input type="submit" value="Submit Post" />
</form>
<div>post id: <span id="response"></span></div>
<script>
  function onSubmit(event) {
    event.preventDefault();
    const form = document.getElementById('myForm');
    const formData = new FormData(form);
    const responseSpan = document.getElementById('response');
    fetch('https://jsonplaceholder.typicode.com/posts', {
        method: 'POST',
        body: formData
    })
      .then(response => response.json())
      .then(data => { responseSpan.innerHTML = data.id; })
      .catch(error => console.error('Error:', error));
  }
</script>

WARNING

При передаче формы в конструктор FormData автоматически включаются все поля формы, включая скрытые. Это может привести к непредвиденному поведению, если вы не будете осторожны, особенно если в форме есть конфиденциальные или ненужные поля.

Обработка загрузки файлов

FormData отлично справляется с обработкой загрузки файлов, что делает его незаменимым инструментом для веб-разработчиков, работающих с полями ввода файлов в формах. Давайте посмотрим, как можно обрабатывать загрузку файлов с помощью FormData:


html
<form id="fileUploadForm">
    <input type="file" name="file" />
    <input type="submit" value="Upload" />
</form>
<script>
    const form = document.getElementById('fileUploadForm');
    form.addEventListener('submit', (event) => {
        event.preventDefault();
        const formData = new FormData(form);
        const fileInput = document.querySelector('input[type="file"]');
        const file = fileInput.files[0];
        if (file) formData.append('file', file);
        fetch('https://httpbin.org/post', {
            method: 'POST',
            body: formData
        })
        .then(response => response.json())
        .then(data => console.log('Upload successful:', data))
        .catch(error => console.error('Error:', error));
    });
</script>

Заключение

FormData — это универсальный и мощный инструмент для управления данными форм в приложениях на JavaScript. Независимо от того, работаете ли вы с простыми текстовыми полями или сложной загрузкой файлов, FormData упрощает этот процесс и предоставляет удобный интерфейс для взаимодействия с данными форм. Освоив FormData, вы сможете повысить интерактивность и отзывчивость ваших веб-приложений, обеспечивая бесшовный пользовательский опыт.

Практика

Какое преимущество дает использование объекта FormData в JavaScript?

Считаете ли это полезным?

Предпросмотр dual-run — сравните с маршрутами Symfony на продакшене.