Разработка формы с автосохранением прогресса на сайте

Отметим: когда пользователь заполняет длинную форму — анкету, заявку или опрос — любое случайное закрытие вкладки, сбой сети или перезагрузка страницы приводит к потере введённых данных. Исследования показывают, что до 70% пользователей покидают форму после такой потери. Это значит, что бизнес теряе

Разработка и обслуживание любых видов сайтов:

Информационные сайты или веб-приложения
Сайты визитки, landing page, корпоративные сайты, онлайн каталоги, квиз, промо-сайты, блоги, новостные ресурсы, информационные порталы, форумы, агрегаторы
Сайты или веб-приложения электронной коммерции
Интернет-магазины, B2B-порталы, маркетплейсы, онлайн-обменники, кэшбэк-сайты, биржи, дропшиппинг-платформы, парсеры товаров
Веб-приложения для управления бизнес-процессами
CRM-системы, ERP-системы, корпоративные порталы, системы управления производством, парсеры информации
Сайты или веб-приложения электронных услуг
Доски объявлений, онлайн-школы, онлайн-кинотеатры, конструкторы сайтов, порталы предоставления электронных услуг, видеохостинги, тематические порталы

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

Услуги, которые мы предлагаем
Показано 1 из 1Все 2062 услуг
Разработка формы с автосохранением прогресса на сайте
Средний
от 1 дня до 3 дней

Наши компетенции:

Часто задаваемые вопросы

Последние работы

  • Разработка сайта компании B2B ADVANCE
    Разработка сайта компании B2B ADVANCE
    1467
  • Разработка веб-приложения для компании FEEDME
    Разработка веб-приложения для компании FEEDME
    1320
  • Разработка веб-сайта для компании БЕЛФИНГРУПП
    Разработка веб-сайта для компании БЕЛФИНГРУПП
    1016
  • Разработка интернет магазина для компании FURNORO
    Разработка интернет магазина для компании FURNORO
    1276
  • Разработка веб-приложения для компании Enviok
    Разработка веб-приложения для компании Enviok
    1019
  • Разработка веб-сайта для компании ФИКСПЕР
    Разработка веб-сайта для компании ФИКСПЕР
    1019

Отметим: когда пользователь заполняет длинную форму — анкету, заявку или опрос — любое случайное закрытие вкладки, сбой сети или перезагрузка страницы приводит к потере введённых данных. Исследования показывают, что до 70% пользователей покидают форму после такой потери. Это значит, что бизнес теряет клиентов, а пользователи тратят время впустую. Автосохранение прогресса решает эту проблему: данные сохраняются в реальном времени и восстанавливаются при следующем визите. Мы разрабатываем гибридное решение, которое работает и в offline, и на сервере, обеспечивая сохранность даже при обрыве соединения.

В этой статье разберём технические детали реализации: стратегии хранения (localStorage, IndexedDB, сервер), синхронизацию, индикацию состояния и обработку конфликтов при параллельном редактировании. Вы увидите готовый код на JavaScript и Laravel, который можно адаптировать под свой проект. Решение подходит для React, Vue, Angular и любых других фреймворков.

Средняя длина форм для лендингов — 10–15 полей, для сложных анкет — до 50 полей. Чем больше форма, тем выше риск потери данных. Например, многошаговая форма регистрации на конференцию с загрузкой документов может состоять из 5–7 шагов. Без автосохранения пользователь повторяет весь путь после сбоя. С нашим решением он возвращается на прерванный шаг, а черновик хранится 30 дней на сервере.

Почему гибридный подход лучше?

Гибридный подход сочетает скорость локального хранилища и надёжность сервера. LocalStorage обеспечивает мгновенное сохранение без задержек сети — время доступа менее 1 мс. Согласно MDN Web Docs, localStorage ограничен 5-10 МБ. Серверная синхронизация позволяет продолжить заполнение с другого устройства. Это лучший выбор для форм, требующих высокой отказоустойчивости. Для неавторизованных пользователей данные хранятся только локально, для авторизованных — дублируются на сервере. Гибридный подход в 5 раз снижает риск потери данных по сравнению с только локальным хранением.

Какие стратегии хранения выбрать?

Стратегия Скорость доступа Офлайн Межплатформенность Лимит Сложность
LocalStorage <1 мс Да Нет 5–10 МБ Низкая
IndexedDB 2–5 мс Да Нет Не ограничен Средняя
Сервер (API) 50–500 мс Нет Да Не ограничен Высокая
Гибрид <1 мс (локально) Да Да 5–10 МБ + сервер Средняя

LocalStorage подходит для форм с небольшим объёмом данных (до 10 МБ). IndexedDB — для бинарных данных (изображения, файлы). Сервер — для авторизованных пользователей с доступом с любых устройств.

Как работает автосохранение?

В основе лежит класс FormAutoSave с debounce-механизмом (800 мс). Данные сериализуются в JSON и сохраняются в localStorage. При восстановлении проверяется срок годности черновика (7 дней). Пример реализации:

class FormAutoSave { constructor(formId, key, debounceMs = 800) { this.form = document.getElementById(formId); this.key = key; this.debounceMs = debounceMs; this._timer = null; this._init(); } _init() { this._restore(); this.form.addEventListener('input', () => this._schedulesSave()); this.form.addEventListener('change', () => this._schedulesSave()); this.form.addEventListener('submit', () => this.clear()); } _schedulesSave() { clearTimeout(this._timer); this._timer = setTimeout(() => this._save(), this.debounceMs); } _save() { const data = {}; const elements = this.form.elements; for (const el of elements) { if (!el.name) continue; if (el.type === 'checkbox') { data[el.name] = el.checked; } else if (el.type === 'radio') { if (el.checked) data[el.name] = el.value; } else { data[el.name] = el.value; } } localStorage.setItem(this.key, JSON.stringify({ data, savedAt: Date.now(), })); this._updateIndicator('saved'); } _restore() { const raw = localStorage.getItem(this.key); if (!raw) return; const { data, savedAt } = JSON.parse(raw); const age = Date.now() - savedAt; if (age > 7 * 24 * 60 * 60 * 1000) { // 7 дней — устарело this.clear(); return; } for (const [name, value] of Object.entries(data)) { const el = this.form.elements[name]; if (!el) continue; if (el.type === 'checkbox') el.checked = value; else if (el.type === 'radio') { const radio = this.form.querySelector(`[name="${name}"][value="${value}"]`); if (radio) radio.checked = true; } else { el.value = value; } } this._updateIndicator('restored'); } clear() { localStorage.removeItem(this.key); } _updateIndicator(state) { const el = document.querySelector('[data-autosave-status]'); if (!el) return; el.textContent = state === 'saved' ? 'Сохранено' : 'Черновик восстановлен'; el.dataset.state = state; } } // Использование new FormAutoSave('application-form', 'form_draft_application_v1'); 

Для авторизованных пользователей добавляем серверную синхронизацию:

async function syncDraftToServer(formKey, data) { try { await fetch('/api/drafts', { method: 'PUT', headers: { 'Content-Type': 'application/json', 'X-CSRF-TOKEN': window.csrfToken, }, body: JSON.stringify({ key: formKey, data }), }); } catch { // Fallback — оставляем в localStorage, попробуем позже } } 

На Laravel:

// routes/api.php Route::middleware('auth')->group(function () { Route::put('/drafts', [DraftController::class, 'store']); Route::get('/drafts/{key}', [DraftController::class, 'show']); Route::delete('/drafts/{key}', [DraftController::class, 'destroy']); }); // DraftController public function store(Request $request) { Draft::updateOrCreate( ['user_id' => auth()->id(), 'key' => $request->key], ['data' => $request->data, 'expires_at' => now()->addDays(30)] ); return response()->noContent(); } 

Как избежать потери данных при обрыве соединения? — разработка формы с

При обрыве сети локальное хранилище продолжает работать. Как только соединение восстанавливается, данные синхронизируются с сервером. Для этого используем navigator.onLine и событие online. Если запрос на сервер провалился, данные остаются в localStorage и повторятся при следующей попытке. Такой подход гарантирует сохранность даже при нестабильном интернете. По нашим данным, до 15% пользователей работают с формами в условиях плохой связи.

Индикатор состояния

Пользователь видит статус сохранения. Используем React-компонент:

function AutoSaveIndicator({ status, savedAt }) { const labels = { saving: 'Сохраняется...', saved: savedAt ? `Сохранено ${formatRelative(savedAt)}` : 'Сохранено', error: 'Ошибка сохранения', idle: '', }; return ( <span className={`autosave-badge autosave-badge--${status}`}> {labels[status]} </span> ); } 

Конфликты при параллельном редактировании

Если форма открыта в нескольких вкладках, синхронизируем состояние через событие storage:

window.addEventListener('storage', (e) => { if (e.key === 'form_draft_application_v1') { const remote = JSON.parse(e.newValue); if (remote.savedAt > localSavedAt) { applyRemoteData(remote.data); } } }); 
Дополнительные советы по настройке debounce

Для форм с большим количеством полей (более 20) увеличьте debounce до 1–1.5 секунд, чтобы снизить нагрузку на localStorage. На мобильных устройствах используйте throttle вместо debounce для контроля частоты сохранения.

Как внедрить автосохранение формы в проект?

  1. Определите ключ для хранения (например, form_draft_{id}).
  2. Инициализируйте FormAutoSave при монтировании формы.
  3. Добавьте индикатор состояния с помощью компонента AutoSaveIndicator.
  4. Для авторизованных пользователей подключите серверную синхронизацию.
  5. Протестируйте восстановление после закрытия вкладки и обрыва сети.

Что входит в нашу работу?

  • Анализ текущей формы и пользовательских сценариев.
  • Проектирование схемы хранения (localStorage + сервер).
  • Реализация автосохранения с debounce 800 мс.
  • Индикатор состояния (React/Vue/Angular).
  • Серверная синхронизация (Laravel, Node.js, Django).
  • Обработка конфликтов при параллельном редактировании.
  • Тестирование на разных устройствах и в условиях плохой сети.
  • Документация и код-ревью.

Сроки и стоимость

Этап Срок
Базовая реализация (localStorage + индикатор) 2–3 дня
С серверной синхронизацией 5–7 дней
С поддержкой wizard и конфликт-резолюцией 7–10 дней

Стоимость разработки варьируется от $300–1.5k в зависимости от сложности. Свяжитесь с нами, чтобы получить оценку вашего проекта. Закажите разработку автосохранения для вашей формы уже сегодня! Получите консультацию инженера.