Как реализовать запрет на повторное заполнение формы одним пользователем на Tilda?
Имеется всплывающая форма, активируемая по клику на кнопку. Требуется настроить так, чтобы при повторном нажатии на кнопку открывалось окно с сообщением об успешной отправке (поскольку форма уже была заполнена ранее).
Предполагается, что решение может быть связано с сохранением данных пользователя в local storage, но механизм реализации неизвестен.
Дополнительная сложность заключается в недавнем обновлении Tilda: теперь форма автоматически закрывается после отправки и отображает сообщение об успехе без присвоения идентификатора (ID), что затрудняет отслеживание уже отправленных форм.
Чтобы реализовать запрет на повторное заполнение формы в Tilda, используйте localStorage для отслеживания отправленных форм. При первом заполнении сохраните уникальный идентификатор формы в localStorage, и при последующих кликах на кнопку проверяйте наличие этого идентификатора, отображая вместо формы сообщение об успешной отправке.
Содержание
- Принцип работы решения
- Реализация через localStorage
- Интеграция с Tilda
- Обработка всплывающих окон
- Альтернативные методы
- Тестирование и отладка
Принцип работы решения
Основная идея заключается в использовании localStorage браузера для хранения информации о том, что форма уже была отправлена конкретным пользователем. Когда пользователь впервые заполняет и отправляет форму, мы сохраняем специальный маркер в localStorage. При последующих попытках открыть эту же форму система проверяет наличие этого маркера и вместо формы показывает сообщение об успешной отправке.
Преимущества этого подхода:
- Работает без перезагрузки страницы
- Сохраняется даже при закрытии вкладки
- Не требует серверной части
- Простая реализация
Однако есть важное ограничение: localStorage привязан к конкретному домену и поддомену, поэтому если у вас есть несколько поддоменов, может потребоваться использование cookies вместо localStorage.
Реализация через localStorage
Для реализации потребуется добавить JavaScript код, который будет управлять процессом. Вот базовый алгоритм:
-
Создание уникального идентификатора формы - используйте уникальный ID для каждой формы на вашем сайте
-
Проверка при открытии формы - перед отображением формы проверяйте, был ли она уже отправлена
-
Сохранение после отправки - после успешной отправки сохраняйте информацию в localStorage
Пример кода для проверки:
// Функция проверки, была ли форма уже отправлена
function isFormSubmitted(formId) {
const submittedForms = JSON.parse(localStorage.getItem('submittedForms') || '[]');
return submittedForms.includes(formId);
}
// Функция отметки формы как отправленной
function markFormAsSubmitted(formId) {
const submittedForms = JSON.parse(localStorage.getItem('submittedForms') || '[]');
if (!submittedForms.includes(formId)) {
submittedForms.push(formId);
localStorage.setItem('submittedForms', JSON.stringify(submittedForms));
}
}
Интеграция с Tilda
В Tilda есть несколько способов добавить этот функционал:
Через Zero Block
- Откройте Zero Block редактор
- Добавьте HTML-блок
- Вставьте JavaScript код
- Настройте триггеры для кнопки и формы
Через интеграцию с GTM
Как упоминается в Analytics Mania, можно настроить Google Tag Manager для отслеживания отправленных форм через local storage:
- Создайте пользовательскую переменную JavaScript
- Настройте триггер на клик по кнопке отправки
- Добавьте тег для сохранения ID формы в localStorage
- Создайте отдельную логику для проверки перед открытием формы
Через HTML-интеграцию
Добавьте следующий код в настройки страницы Tilda:
<script>
document.addEventListener('DOMContentLoaded', function() {
// ID вашей формы
const formId = 'your-form-id';
// Проверяем, была ли форма уже отправлена
if (isFormSubmitted(formId)) {
// Показываем сообщение об успехе вместо формы
showSuccessMessage();
return;
}
// Функция отправки формы
function submitForm() {
// Логика отправки формы
markFormAsSubmitted(formId);
showSuccessMessage();
}
// Привязка к кнопке отправки
const submitButton = document.querySelector('#submit-button');
if (submitButton) {
submitButton.addEventListener('click', submitForm);
}
});
</script>
Обработка всплывающих окон
Для всплывающих форм в Tilda требуется дополнительная логика:
-
Модификация триггера открытия - перед открытием popup проверяйте состояние формы
-
Управление контентом popup - в зависимости от состояния показывайте либо форму, либо сообщение
-
Обработка автоматического закрытия - учитывайте, что Tilda автоматически закрывает форму после отправки
Пример для popup формы:
// Функция открытия popup с проверкой
function openPopupWithCheck(popupId) {
if (isFormSubmitted(popupId)) {
// Создаем элемент с сообщением об успехе
const successMessage = createSuccessMessage();
// Показываем его вместо popup
showSuccessElement(successMessage);
} else {
// Открываем обычный popup
Tilda.Forms.openPopup(popupId);
}
}
// Заменяем стандартное открытие popup
const originalOpen = Tilda.Forms.openPopup;
Tilda.Forms.openPopup = function(popupId) {
openPopupWithCheck(popupId);
};
Альтернативные методы
Использование cookies
Если работаете с несколькими поддоменами, используйте cookies вместо localStorage:
// Функция работы с cookies
function setCookie(name, value, days) {
const date = new Date();
date.setTime(date.getTime() + (days * 24 * 60 * 60 * 1000));
const expires = "expires=" + date.toUTCString();
document.cookie = name + "=" + value + ";" + expires + ";path=/";
}
function getCookie(name) {
const cname = name + "=";
const decodedCookie = decodeURIComponent(document.cookie);
const ca = decodedCookie.split(';');
for(let i = 0; i < ca.length; i++) {
let c = ca[i];
while (c.charAt(0) == ' ') {
c = c.substring(1);
}
if (c.indexOf(cname) == 0) {
return c.substring(cname.length, c.length);
}
}
return "";
}
Интеграция с внешними сервисами
Сервисы вроде Tally.so предлагают встроенные механизмы предотвращения дубликатов:
- Настройте webhook для приема данных
- Используйте их API для проверки дубликатов
- Реализуйте логику отображения сообщений
Серверная проверка
Если требуется более надежное решение, реализуйте серверную проверку:
- Отправляйте уникальный ID вместе с данными формы
- Проверяйте на сервере, не была ли уже отправлена форма с таким ID
- Возвращайте соответствующий статус
Тестирование и отладка
При реализации важно протестировать различные сценарии:
- Первое открытие - форма должна открываться нормально
- Повторное открынение - должно показываться сообщение об успехе
- Очистка localStorage - после очистки форма должна снова открываться
- Разные браузеры - проверьте работу в разных браузерах
- Инкогнито-режим - убедитесь, что работает корректно
Для отладки используйте консоль браузера:
// Включите логирование
console.log('Проверка формы:', formId);
console.log('Отправленные формы:', localStorage.getItem('submittedForms'));
console.log('Форма уже отправлена:', isFormSubmitted(formId));
Источники
- Prevent Duplicate Form Submissions with Google Tag Manager - Analytics Mania
- Prevent duplicate submissions - Tally.so Help
- How to Set Up Forms on Tilda - Official Documentation
- Multiple Form Submission Prevention - Will Master
- How do I create a pop-up window? - Tilda FAQ
Заключение
Для реализации запрета на повторное заполнение форм в Tilda рекомендуется использовать localStorage с учетом следующих моментов:
- Создайте уникальный идентификатор для каждой формы на сайте
- Реализуйте проверку перед открытием формы через JavaScript
- Сохраняйте статус отправки в localStorage после успешной отправки
- Учитывайте особенности Tilda - автоматическое закрытие форм и popup
- Тестируйте решение в разных сценариях использования
Если стандартные методы не подходят, рассмотрите альтернативные варианты с cookies или внешними сервисами. Для более надежной защиты можно комбинировать несколько подходов одновременно.