\n```\n\nТестируйте: отправьте форму, обновите страницу — кнопка покажет сообщение. Идеально для настройки формы tilda.\n\n---\n\n## Тестирование настройки формы tilda и возможные проблемы {#testing-troubleshooting}\n\nЗапустите в инкогнито, очистите localStorage (F12 > Application > Local Storage). Отправьте форму — флаг сохранится? Кликните повторно — модалка успеха?\n\nПроблемы:\n- **Observer не ловит**: Уточните селектор в DOM после отправки.\n- **Множественные страницы**: Дублируйте T123 или добавьте в настройки проекта.\n- **Мобильные**: LocalStorage работает, но проверьте модалки на iOS.\n- **Конфликты**: Уникальный ключ решает.\n\n[Официальные FAQ Tilda](https://tilda.cc/ru/answers/a/html/) упоминают: код T123 выполняется после загрузки, так что DOM-ready обязателен.\n\n---\n\n## Альтернативы для tilda формы обратной связи {#alternatives}\n\nНе фанат JS? Интегрируйте с Google Tag Manager — там теги на события форм. Или внешний сервис вроде FormKeep с webhook'ами на сервер (проверяет email/телефон).\n\nДля pro: сохраняйте hash email'а в localStorage, чтобы юзер мог отправить с новым. Но для простых tilda формы хватит нашего подхода — 50 строк кода, ноль серверов.\n\nФорма tilda zero block? Аналогично, только ID блока в селекторах.\n\n---\n\n## Источники {#sources}\n\n1. [Примеры полезных JS-скриптов](https://help-ru.tilda.cc/tips/javascript) \n2. [Как добавить свой HTML, CSS или Javascript-код?](https://tilda.cc/ru/answers/a/html/) \n3. [Как подключить JavaScript в Tilda](https://webvova.ru/blog/tilda-i-javascript/1-kak-luchshe-dobavlyat-js-v-tilda/) \n4. [How to Use LocalStorage in JavaScript](https://www.freecodecamp.org/news/use-local-storage-in-modern-applications/) \n5. [JavaScript's MutationObserver API](https://medium.com/@jawaragordon/javascripts-mutationobserver-api-secrets-of-the-ooze-revealed-47137719c14b)\n\n---\n\n## Заключение {#conclusion}\n\nНастройка формы tilda с запретом дубликатов через localStorage и MutationObserver — надёжный хак для 2026 года, даже после обновлений Tilda. Добавьте T123, вставьте код, протестируйте — и повторные заявки уйдут в прошлое. Если трафик большой, комбинируйте с сервером, но для старта хватит клиента. Теперь ваши tilda формы станут чище и удобнее."},{"name":"Как запретить повторную отправку формы в Tilda","step":[{"name":"Добавьте блок T123 для JavaScript в Tilda","@type":"HowToStep","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/c/web/q/prevent-duplicate-tilda-form-submissions","position":1},{"name":"Сохраните состояние формы в localStorage","@type":"HowToStep","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/c/web/q/prevent-duplicate-tilda-form-submissions","position":2},{"name":"Отслеживайте успех отправки с MutationObserver","@type":"HowToStep","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/c/web/q/prevent-duplicate-tilda-form-submissions","position":3},{"name":"Настройте кнопку для проверки localStorage","@type":"HowToStep","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/c/web/q/prevent-duplicate-tilda-form-submissions","position":4},{"name":"Вставьте полный код и протестируйте","@type":"HowToStep","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/c/web/q/prevent-duplicate-tilda-form-submissions","position":5}],"@type":"HowTo","@context":"https://schema.org","description":"Пошаговая инструкция по реализации запрета дубликатов форм в Tilda с помощью localStorage и MutationObserver.","mainEntityOfPage":{"@type":"WebPage","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/c/web/q/prevent-duplicate-tilda-form-submissions"},"inLanguage":"ru","dateCreated":"2025-11-07T10:54:47.023Z","datePublished":"2025-11-07T10:54:47.023Z","dateModified":"2026-01-12T07:47:41.552Z","author":[{"@type":"Organization","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/about","name":"НейроОтветы","url":"https://xn--b1afbosiaouc3h.xn--p1ai/about","logo":{"@type":"ImageObject","url":"https://xn--b1afbosiaouc3h.xn--p1ai/logo.png","width":"512","height":"512"}}],"publisher":{"@type":"Organization","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/about","name":"НейроОтветы","url":"https://xn--b1afbosiaouc3h.xn--p1ai/about","logo":{"@type":"ImageObject","url":"https://xn--b1afbosiaouc3h.xn--p1ai/logo.png","width":"512","height":"512"}},"@id":"https://xn--b1afbosiaouc3h.xn--p1ai/c/web/q/prevent-duplicate-tilda-form-submissions","url":"https://xn--b1afbosiaouc3h.xn--p1ai/c/web/q/prevent-duplicate-tilda-form-submissions"},{"@type":"CollectionPage","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/c/web/q/prevent-duplicate-tilda-form-submissions/#related-questions","name":"Tilda формы: запрет повторной отправки с JS","description":"Настройка формы Tilda для запрета дубликатов: используйте localStorage и MutationObserver. Пошаговый гайд по добавлению JS в блок T123, отслеживанию успеха отправки без ID и показу сообщения при повторном клике. Идеально для форм заявок и всплывающих модалок.","url":"https://xn--b1afbosiaouc3h.xn--p1ai/c/web/q/prevent-duplicate-tilda-form-submissions","inLanguage":"ru","mainEntity":{"@type":"ItemList","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/c/web/q/prevent-duplicate-tilda-form-submissions/#related-questions","itemListElement":[{"@type":"ListItem","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/c/web/q/optimize-javascript-tabs-event-delegation","name":"Оптимизация вкладок JS: делегирование и data-атрибуты","position":1,"item":{"@type":"Article","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/c/web/q/optimize-javascript-tabs-event-delegation","mainEntityOfPage":{"@type":"WebPage","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/c/web/q/optimize-javascript-tabs-event-delegation"},"inLanguage":"ru","dateCreated":"2026-03-04T13:18:51.727Z","datePublished":"2026-03-04T13:18:51.727Z","dateModified":"2026-03-04T13:18:51.727Z","author":[{"@type":"Person","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/@ramy-nasr","name":"Ramy Nasr","givenName":"Ramy","familyName":"Nasr","url":"https://xn--b1afbosiaouc3h.xn--p1ai/@ramy-nasr","jobTitle":"Разработчик JavaScript","description":"Активный участник Stack Overflow с репутацией 2,567, специализируется на PHP, Symfony, Doctrine ORM, JavaScript и jQuery. Имеет вклад в 79 ответов и участие в нескольких сетях Stack Exchange."},{"@type":"Person","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/@orenrocco","name":"@orenrocco","url":"https://xn--b1afbosiaouc3h.xn--p1ai/@orenrocco","jobTitle":"Веб-разработчик","description":"Участник Stack Overflow с репутацией 21, активен в темах HTML, jQuery, JavaScript. Участвует также в Code Review и других сетях Stack Exchange."},{"@type":"Person","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/@mulan","name":"@mulan","url":"https://xn--b1afbosiaouc3h.xn--p1ai/@mulan","jobTitle":"Разработчик jQuery-плагинов","description":"Участник Stack Overflow, специализируется на разработке jQuery-плагинов и оптимизации интерфейсов."},{"@type":"Person","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/@user863","name":"@user863","url":"https://xn--b1afbosiaouc3h.xn--p1ai/@user863","jobTitle":"Разработчик интерфейсов","description":"Участник Stack Overflow, фокусируется на интерфейсах и jQuery-решениях для вкладок."},{"@type":"Person","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/@gwer","name":"Владлен Грачев","givenName":"Владлен","familyName":"Грачев","url":"https://xn--b1afbosiaouc3h.xn--p1ai/@gwer","image":{"@type":"ImageObject","url":"https://xn--b1afbosiaouc3h.xn--p1ai/api/v1/person/gwer/avatar.png","width":"72","height":"72"},"jobTitle":"JavaScript-разработчик","description":"Опытный разработчик с вкладом в 291 ответ и 2 вопроса на Хабр Q&A. Активен в тегах JavaScript, PHP, CSS, HTML, программирование, Python."},{"@type":"Person","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/@stalker-red","name":"@stalker-red","url":"https://xn--b1afbosiaouc3h.xn--p1ai/@stalker-red","jobTitle":"Веб-разработчик","description":"Активный участник Хабр Q&A по веб-разработке и JavaScript."},{"@type":"Person","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/@diithitech","name":"Dmitriy Mozgovoy","givenName":"Dmitriy","familyName":"Mozgovoy","url":"https://xn--b1afbosiaouc3h.xn--p1ai/@diithitech","image":{"@type":"ImageObject","url":"https://xn--b1afbosiaouc3h.xn--p1ai/api/v1/person/diithitech/avatar.png","width":"72","height":"72"},"jobTitle":"Fullstack JavaScript-разработчик","description":"Fullstack-разработчик на Хабр Q&A, специализируется на JS и архитектуре кода."},{"@type":"Person","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/@sageptr","name":"@sageptr","url":"https://xn--b1afbosiaouc3h.xn--p1ai/@sageptr","image":{"@type":"ImageObject","url":"https://xn--b1afbosiaouc3h.xn--p1ai/api/v1/person/sageptr/avatar.png","width":"72","height":"72"},"jobTitle":"Разработчик","description":"Разработчик на Хабр Q&A, участвует в обсуждениях JS и DOM."},{"@type":"Person","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/@inkvizitor","name":"Инквизитор","givenName":"Инквизитор","url":"https://xn--b1afbosiaouc3h.xn--p1ai/@inkvizitor","jobTitle":"Фронтенд-разработчик","description":"Профессиональный разработчик, отвечающий на вопросы на Stack Overflow"},{"@type":"Person","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/@itchief","name":"Александр Мальцев","givenName":"Александр","familyName":"Мальцев","url":"https://xn--b1afbosiaouc3h.xn--p1ai/@itchief","jobTitle":"Автор туториалов по JavaScript","description":"Автор сайта ИТ Шеф, создает туториалы по веб-разработке, фокус на JS, HTML/CSS для начинающих."}],"publisher":{"@type":"Organization","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/about","name":"НейроОтветы","url":"https://xn--b1afbosiaouc3h.xn--p1ai/about","logo":{"@type":"ImageObject","url":"https://xn--b1afbosiaouc3h.xn--p1ai/logo.png","width":"512","height":"512"}},"headline":"Оптимизация вкладок JS: делегирование и data-атрибуты","description":"Как оптимизировать JavaScript-код для переключения вкладок (табов) без дублирования: делегирование событий, data-атрибуты, jQuery-плагины, CSS-only, LocalStorage. Масштабируемо для сотен tabs js с медиа-контентом.","keywords":["вкладки js","tabs js","переключение вкладок","tab вкладки","вкладка javascript","css переключение вкладок","js табы","делегирование событий","data-атрибуты"],"image":["https://xn--b1afbosiaouc3h.xn--p1ai/api/v1/question/15833/preview/1x1.png","https://xn--b1afbosiaouc3h.xn--p1ai/api/v1/question/15833/preview/4x3.png","https://xn--b1afbosiaouc3h.xn--p1ai/api/v1/question/15833/preview/16x9.png"],"articleBody":""}},{"@type":"ListItem","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/c/web/q/how-to-display-order-number-tilda-thank-you-page","name":"Tilda: номер заказа на странице Спасибо после оплаты","position":2,"item":{"@type":"Article","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/c/web/q/how-to-display-order-number-tilda-thank-you-page","mainEntityOfPage":{"@type":"WebPage","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/c/web/q/how-to-display-order-number-tilda-thank-you-page"},"inLanguage":"ru","dateCreated":"2026-01-02T15:34:47.486Z","datePublished":"2026-01-02T15:34:47.486Z","dateModified":"2026-01-02T15:34:47.486Z","author":[{"@type":"Organization","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/about","name":"НейроОтветы","url":"https://xn--b1afbosiaouc3h.xn--p1ai/about","logo":{"@type":"ImageObject","url":"https://xn--b1afbosiaouc3h.xn--p1ai/logo.png","width":"512","height":"512"}}],"publisher":{"@type":"Organization","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/about","name":"НейроОтветы","url":"https://xn--b1afbosiaouc3h.xn--p1ai/about","logo":{"@type":"ImageObject","url":"https://xn--b1afbosiaouc3h.xn--p1ai/logo.png","width":"512","height":"512"}},"headline":"Tilda: номер заказа на странице Спасибо после оплаты","description":"Как вывести номер и состав заказа на странице «Спасибо» в Tilda после оплаты из корзины. Инструкции по tilda javascript, webhook, tilda api и localStorage. Примеры кода, чек-лист и отладка для tilda оплата и tilda корзина.","keywords":["tilda оплата","tilda api","tilda заказы","tilda корзина","tilda webhook","tilda javascript","страница спасибо tilda","tilda переменные"],"image":[],"articleBody":""}},{"@type":"ListItem","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/c/web/q/change-html-test-results-devtools-browser","name":"Как изменить HTML-тест через инструменты разработчика","position":3,"item":{"@type":"Article","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/c/web/q/change-html-test-results-devtools-browser","mainEntityOfPage":{"@type":"WebPage","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/c/web/q/change-html-test-results-devtools-browser"},"inLanguage":"ru","dateCreated":"2026-01-02T13:17:46.859Z","datePublished":"2026-01-02T13:17:46.859Z","dateModified":"2026-01-02T13:17:46.859Z","author":[{"@type":"Organization","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/about","name":"НейроОтветы","url":"https://xn--b1afbosiaouc3h.xn--p1ai/about","logo":{"@type":"ImageObject","url":"https://xn--b1afbosiaouc3h.xn--p1ai/logo.png","width":"512","height":"512"}}],"publisher":{"@type":"Organization","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/about","name":"НейроОтветы","url":"https://xn--b1afbosiaouc3h.xn--p1ai/about","logo":{"@type":"ImageObject","url":"https://xn--b1afbosiaouc3h.xn--p1ai/logo.png","width":"512","height":"512"}},"headline":"Как изменить HTML-тест через инструменты разработчика","description":"Подробная инструкция: как заменить картинку результата (крест/галочка), найти правильные ответы в HTML/JS-коде страницы с помощью инструментов разработчика браузера. Пошаговые примеры для Chrome, Yandex, Edge, ограничения серверной проверки.","keywords":["инструменты разработчика","как открыть инструмент разработчика","инструмент разработчика в браузере","инструменты разработчика chrome","как открыть инструменты разработчика","консоль инструментов разработчика","devtools","изменить html тест","найти ответы в коде","заменить картинку devtools"],"image":[],"articleBody":""}},{"@type":"ListItem","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/c/web/q/motion-blur-slide-transitions-web","name":"Motion blur при переключении слайдов: реализация в вебе","position":4,"item":{"@type":"Article","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/c/web/q/motion-blur-slide-transitions-web","mainEntityOfPage":{"@type":"WebPage","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/c/web/q/motion-blur-slide-transitions-web"},"inLanguage":"ru","dateCreated":"2026-03-19T12:13:09.563Z","datePublished":"2026-03-19T12:13:09.563Z","dateModified":"2026-03-19T13:52:00.259Z","author":[{"@type":"Person","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/@andyadams","name":"Andy Adams","givenName":"Andy","familyName":"Adams","url":"https://xn--b1afbosiaouc3h.xn--p1ai/@andyadams","image":{"@type":"ImageObject","url":"https://xn--b1afbosiaouc3h.xn--p1ai/api/v1/person/andyadams/avatar.png","width":"72","height":"72"},"jobTitle":"Технический писатель","description":"Технический писатель, автор статей на CSS-Tricks, специализирующийся на веб-разработке и CSS"},{"@type":"Person","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/@gabrielshoyombo","name":"Gabriel Shoyombo","givenName":"Gabriel","familyName":"Shoyombo","url":"https://xn--b1afbosiaouc3h.xn--p1ai/@gabrielshoyombo","image":{"@type":"ImageObject","url":"https://xn--b1afbosiaouc3h.xn--p1ai/api/v1/person/gabrielshoyombo/avatar.png","width":"72","height":"72"},"jobTitle":"Технический писатель","description":"Технический писатель, автор статей на CSS-Tricks, специализирующийся на веб-разработке и CSS"},{"@type":"Organization","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/@css-tricks-com","name":"CSS-Tricks","description":"Ресурс для веб-разработчиков с практическими примерами и советами по CSS","url":"https://xn--b1afbosiaouc3h.xn--p1ai/@css-tricks-com","logo":{"@type":"ImageObject","url":"https://xn--b1afbosiaouc3h.xn--p1ai/api/v1/source/css-tricks-com/icon.png","width":"72","height":"72"}},{"@type":"Organization","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/@developer-mozilla-org","name":"MDN Web Docs","description":"Официальная документация по веб-технологиям для разработчиков","url":"https://xn--b1afbosiaouc3h.xn--p1ai/@developer-mozilla-org","logo":{"@type":"ImageObject","url":"https://xn--b1afbosiaouc3h.xn--p1ai/api/v1/source/developer-mozilla-org/logo.png","width":"72","height":"72"}},{"@type":"Organization","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/@greensock-com","name":"GSAP","description":"Платформа для создания профессиональных веб-анимаций, предоставляющая мощные инструменты для анимации JavaScript","url":"https://xn--b1afbosiaouc3h.xn--p1ai/@greensock-com"}],"publisher":{"@type":"Organization","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/about","name":"НейроОтветы","url":"https://xn--b1afbosiaouc3h.xn--p1ai/about","logo":{"@type":"ImageObject","url":"https://xn--b1afbosiaouc3h.xn--p1ai/logo.png","width":"512","height":"512"}},"headline":"Motion blur при переключении слайдов: реализация в вебе","description":"Пошаговое руководство по реализации motion blur при переключении слайдов. Примеры кода на HTML, CSS и JavaScript для создания плавных переходов.","keywords":["motion blur","анимация слайдов","размытие в движении","анимация перехода слайдов","эффект motion blur","CSS transition","javascript animations","css transitions transform","real motion blur","video motion blur"],"image":[],"articleBody":""}},{"@type":"ListItem","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/c/web/q/vis-js-network-focus-node-by-url-id","name":"vis.js Network: фокус на узле по ID из URL","position":5,"item":{"@type":"Article","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/c/web/q/vis-js-network-focus-node-by-url-id","mainEntityOfPage":{"@type":"WebPage","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/c/web/q/vis-js-network-focus-node-by-url-id"},"inLanguage":"ru","dateCreated":"2026-01-03T14:17:31.203Z","datePublished":"2026-01-03T14:17:31.203Z","dateModified":"2026-01-03T14:17:31.203Z","author":[{"@type":"Organization","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/about","name":"НейроОтветы","url":"https://xn--b1afbosiaouc3h.xn--p1ai/about","logo":{"@type":"ImageObject","url":"https://xn--b1afbosiaouc3h.xn--p1ai/logo.png","width":"512","height":"512"}}],"publisher":{"@type":"Organization","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/about","name":"НейроОтветы","url":"https://xn--b1afbosiaouc3h.xn--p1ai/about","logo":{"@type":"ImageObject","url":"https://xn--b1afbosiaouc3h.xn--p1ai/logo.png","width":"512","height":"512"}},"headline":"vis.js Network: фокус на узле по ID из URL","description":"Как в vis.js Network автоматически выделить узел по ID из URL (?node=123), отцентрировать и увеличить масштаб с помощью network.focus, selectNodes и stabilized. Полный пример кода на JavaScript для загрузки страницы.","keywords":["vis js","vis network","vis.js network","network focus","selectnodes","фокус на узле","url параметры","vis.js stabilized","network moveto"],"image":[],"articleBody":""}},{"@type":"ListItem","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/c/web/q/how-to-make-div-clickable-link-xhtml11","name":"Как сделать div блок кликабельной ссылкой в XHTML 1.1","position":6,"item":{"@type":"Article","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/c/web/q/how-to-make-div-clickable-link-xhtml11","mainEntityOfPage":{"@type":"WebPage","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/c/web/q/how-to-make-div-clickable-link-xhtml11"},"inLanguage":"ru","dateCreated":"2026-02-24T10:27:15.569Z","datePublished":"2026-02-24T10:27:15.569Z","dateModified":"2026-02-24T10:27:15.569Z","author":[{"@type":"Person","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/@vlad-merzhevich","name":"Влад Мержевич","givenName":"Влад","familyName":"Мержевич","url":"https://xn--b1afbosiaouc3h.xn--p1ai/@vlad-merzhevich","jobTitle":"Автор справочника","description":"Автор и владелец сайта htmlbook.ru, занимается разработкой и поддержкой справочника по веб-технологиям с 2002 года."},{"@type":"Organization","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/@htmlbook-ru","name":"htmlbook.ru","description":"Онлайн-справочник по HTML, CSS, JavaScript и смежным веб-технологиям с примерами и правилами использования тегов. Авторский проект Влада Мержевича с 2002 года.","url":"https://xn--b1afbosiaouc3h.xn--p1ai/@htmlbook-ru","logo":{"@type":"ImageObject","url":"https://xn--b1afbosiaouc3h.xn--p1ai/api/v1/source/htmlbook-ru/icon.png","width":"72","height":"72"}},{"@type":"Person","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/@palmervan","name":"@palmervan","url":"https://xn--b1afbosiaouc3h.xn--p1ai/@palmervan","jobTitle":"Разработчик","description":"Участник сообщества Stack Overflow на русском, отвечает на вопросы по HTML/CSS и верстке."},{"@type":"Person","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/@alekseyb","name":"Aleksey B","givenName":"Aleksey","familyName":"B","url":"https://xn--b1afbosiaouc3h.xn--p1ai/@alekseyb","jobTitle":"Разработчик","description":"Разработчик, участник русскоязычного Stack Overflow"},{"@type":"Organization","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/@ru-stackoverflow-com","name":"Stack Overflow","description":"Русскоязычная версия Stack Overflow - платформа вопросов и ответов для программистов","url":"https://xn--b1afbosiaouc3h.xn--p1ai/@ru-stackoverflow-com","logo":{"@type":"ImageObject","url":"https://xn--b1afbosiaouc3h.xn--p1ai/api/v1/source/ru-stackoverflow-com/logo.png","width":"72","height":"72"}},{"@type":"Organization","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/@www-w3-org","name":"W3C","description":"Всемирное консорциум веб-технологий (World Wide Web Consortium), разрабатывающий стандарты и рекомендации по веб-технологиям на основе принципов доступности, интернационализации, приватности и безопасности.","url":"https://xn--b1afbosiaouc3h.xn--p1ai/@www-w3-org","logo":{"@type":"ImageObject","url":"https://xn--b1afbosiaouc3h.xn--p1ai/api/v1/source/www-w3-org/icon.png","width":"72","height":"72"}},{"@type":"Person","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/@aleksey-kodov","name":"Алексей Кодов","givenName":"Алексей","familyName":"Кодов","url":"https://xn--b1afbosiaouc3h.xn--p1ai/@aleksey-kodov","jobTitle":"Автор статей","description":"Автор вики-статей Skypro по лайфстайлу и финансам"},{"@type":"Organization","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/@sky-pro","name":"Skypro","description":"Образовательная платформа, предлагающая курсы и материалы по профессиональным навыкам, включая редактирование текстов","url":"https://xn--b1afbosiaouc3h.xn--p1ai/@sky-pro","logo":{"@type":"ImageObject","url":"https://xn--b1afbosiaouc3h.xn--p1ai/api/v1/source/sky-pro/logo.png","width":"72","height":"72"}}],"publisher":{"@type":"Organization","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/about","name":"НейроОтветы","url":"https://xn--b1afbosiaouc3h.xn--p1ai/about","logo":{"@type":"ImageObject","url":"https://xn--b1afbosiaouc3h.xn--p1ai/logo.png","width":"512","height":"512"}},"headline":"Как сделать div блок кликабельной ссылкой в XHTML 1.1","description":"Узнайте, почему нельзя использовать
в XHTML 1.1 для div ссылка. Валидные альтернативы: блочный с CSS, JS onclick. Примеры кода, правила W3C и лучшие практики для всего блока ссылка без изменений визуала.","keywords":["сделать блок ссылкой","div ссылка","блок ссылки","весь блок ссылка","html div ссылки","xhtml 1.1","css div ссылка","html блок ссылка"],"image":[],"articleBody":""}},{"@type":"ListItem","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/c/web/q/cors-error-access-control-allow-origin-browser-postman","name":"Ошибка Access-Control-Allow-Origin: браузер vs Postman","position":7,"item":{"@type":"Article","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/c/web/q/cors-error-access-control-allow-origin-browser-postman","mainEntityOfPage":{"@type":"WebPage","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/c/web/q/cors-error-access-control-allow-origin-browser-postman"},"inLanguage":"ru","dateCreated":"2025-10-22T05:17:38.905Z","datePublished":"2025-10-22T05:17:38.905Z","dateModified":"2026-01-13T19:22:15.344Z","author":[{"@type":"Organization","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/about","name":"НейроОтветы","url":"https://xn--b1afbosiaouc3h.xn--p1ai/about","logo":{"@type":"ImageObject","url":"https://xn--b1afbosiaouc3h.xn--p1ai/logo.png","width":"512","height":"512"}}],"publisher":{"@type":"Organization","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/about","name":"НейроОтветы","url":"https://xn--b1afbosiaouc3h.xn--p1ai/about","logo":{"@type":"ImageObject","url":"https://xn--b1afbosiaouc3h.xn--p1ai/logo.png","width":"512","height":"512"}},"headline":"Ошибка Access-Control-Allow-Origin: браузер vs Postman","description":"Почему возникает ошибка 'На запрашиваемом ресурсе отсутствует заголовок Access-Control-Allow-Origin' в браузере при JS-запросах к API, но работает в Postman. Объяснение CORS, SOP, preflight и отличий клиентов. Анализ с Flask и jQuery.ajax.","keywords":["access control allow origin","cors access control allow origin","ошибка cors","flask cors","xmlhttprequest cors access control allow origin","preflight cors","postman cors","headers access control allow origin","same origin policy","access control allow origin fetch"],"image":[],"articleBody":""}},{"@type":"ListItem","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/c/web/q/htmx-server-autocomplete-textarea-cursor-keyboard","name":"Серверное автодополнение htmx в textarea с курсором","position":8,"item":{"@type":"Article","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/c/web/q/htmx-server-autocomplete-textarea-cursor-keyboard","mainEntityOfPage":{"@type":"WebPage","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/c/web/q/htmx-server-autocomplete-textarea-cursor-keyboard"},"inLanguage":"ru","dateCreated":"2026-03-01T15:10:51.142Z","datePublished":"2026-03-01T15:10:51.142Z","dateModified":"2026-03-01T15:10:51.142Z","author":[{"@type":"Organization","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/@htmx-org","name":"htmx.org","description":"Сайт документации и примеров библиотеки htmx, позволяющей добавлять AJAX, WebSockets и SSE прямо в HTML-атрибуты для создания современных интерфейсов без тяжёлого JS.","url":"https://xn--b1afbosiaouc3h.xn--p1ai/@htmx-org"},{"@type":"Person","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/@khalid-abuhakmeh","name":"Khalid Abuhakmeh","givenName":"Khalid","familyName":"Abuhakmeh","url":"https://xn--b1afbosiaouc3h.xn--p1ai/@khalid-abuhakmeh","jobTitle":"Разработчик-адвокат","description":"Разработчик-адвокат в JetBrains, специализирующийся на создании туториалов по технологиям разработки, включая HTMX, ASP.NET Core и современные веб-интерфейсы."},{"@type":"Person","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/@sandrot","name":"Sandro Turriate","givenName":"Sandro","familyName":"Turriate","url":"https://xn--b1afbosiaouc3h.xn--p1ai/@sandrot","image":{"@type":"ImageObject","url":"https://xn--b1afbosiaouc3h.xn--p1ai/api/v1/person/sandrot/avatar.png","width":"72","height":"72"},"jobTitle":"Веб-разработчик","description":"Программист из Сан-Франциско, фокусирующийся на написании лаконичного и производительного кода, автор статей по современному JavaScript, HTMX и инструментам вроде datalist."},{"@type":"Person","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/@rab-khan","name":"Rab Khan","givenName":"Rab","familyName":"Khan","url":"https://xn--b1afbosiaouc3h.xn--p1ai/@rab-khan","jobTitle":"Веб-разработчик","description":"Опытный веб-разработчик с репутацией более 35k на Stack Overflow, эксперт в JavaScript, CSS, jQuery, ASP.NET, C# и базах данных вроде MySQL и SQL Server."},{"@type":"Person","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/@phacdatahub","name":"@phacdatahub","url":"https://xn--b1afbosiaouc3h.xn--p1ai/@phacdatahub","image":{"@type":"ImageObject","url":"https://xn--b1afbosiaouc3h.xn--p1ai/api/v1/person/phacdatahub/avatar.png","width":"72","height":"72"},"jobTitle":"Разработчик Django-приложений","description":"Хаб данных, партнерств и инноваций Агентства общественного здравоохранения Канады (PHAC), разрабатывающий открытые проекты на Django, HTMX, FHIR и инструменты для здравоохранения."}],"publisher":{"@type":"Organization","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/about","name":"НейроОтветы","url":"https://xn--b1afbosiaouc3h.xn--p1ai/about","logo":{"@type":"ImageObject","url":"https://xn--b1afbosiaouc3h.xn--p1ai/logo.png","width":"512","height":"512"}},"headline":"Серверное автодополнение htmx в textarea с курсором","description":"Реализуйте частичное автодополнение с htmx в input/textarea: фильтрация на сервере, сохранение позиции курсора, клавиатурное управление Enter/стрелки. Примеры JS, Django, datalist. Debounce, partial HTML без мыши.","keywords":["автодополнение","htmx","автодополнение textarea","htmx автодополнение","позиция курсора textarea","серверное автодополнение","htmx django","datalist htmx","автодополнение js"],"image":["https://xn--b1afbosiaouc3h.xn--p1ai/api/v1/question/15595/preview/1x1.png","https://xn--b1afbosiaouc3h.xn--p1ai/api/v1/question/15595/preview/4x3.png","https://xn--b1afbosiaouc3h.xn--p1ai/api/v1/question/15595/preview/16x9.png"],"articleBody":""}},{"@type":"ListItem","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/c/web/q/cross-domain-post-request-javascript-fetch-cors","name":"Кросс-доменный POST-запрос в JS: Fetch без обновления","position":9,"item":{"@type":"Article","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/c/web/q/cross-domain-post-request-javascript-fetch-cors","mainEntityOfPage":{"@type":"WebPage","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/c/web/q/cross-domain-post-request-javascript-fetch-cors"},"inLanguage":"ru","dateCreated":"2026-02-24T10:35:27.960Z","datePublished":"2026-02-24T10:35:27.960Z","dateModified":"2026-02-24T18:28:00.024Z","author":[{"@type":"Person","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/@mdn-contributors","name":"MDN contributors","givenName":"MDN","familyName":"contributors","url":"https://xn--b1afbosiaouc3h.xn--p1ai/@mdn-contributors","jobTitle":"Технические писатели","description":"Активные участники сообщества MDN, занимающиеся переводами и улучшением документации"},{"@type":"Organization","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/@developer-mozilla-org","name":"MDN Web Docs","description":"Официальная документация по веб-технологиям для разработчиков","url":"https://xn--b1afbosiaouc3h.xn--p1ai/@developer-mozilla-org","logo":{"@type":"ImageObject","url":"https://xn--b1afbosiaouc3h.xn--p1ai/api/v1/source/developer-mozilla-org/logo.png","width":"72","height":"72"}},{"@type":"Person","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/@iliakan","name":"Ilya Kantor","givenName":"Ilya","familyName":"Kantor","url":"https://xn--b1afbosiaouc3h.xn--p1ai/@iliakan","image":{"@type":"ImageObject","url":"https://xn--b1afbosiaouc3h.xn--p1ai/api/v1/person/iliakan/avatar.png","width":"72","height":"72"},"jobTitle":"Разработчик","description":"Автор, тренер и JavaScript-разработчик, создатель Modern JavaScript Tutorial"},{"@type":"Person","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/@igrishaev","name":"Иван Гришаев","givenName":"Иван","familyName":"Гришаев","url":"https://xn--b1afbosiaouc3h.xn--p1ai/@igrishaev","jobTitle":"Backend-инженер","description":"Удалённый IT-инженер, backend-разработчик в европейской fintech-компании, специалист по Clojure, SQL, Postgres, функциональному программированию (Lisp), автор двух книг по Clojure, спикер сообщества, отец троих детей, интересуется книгами, переговорами и образованием"}],"publisher":{"@type":"Organization","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/about","name":"НейроОтветы","url":"https://xn--b1afbosiaouc3h.xn--p1ai/about","logo":{"@type":"ImageObject","url":"https://xn--b1afbosiaouc3h.xn--p1ai/logo.png","width":"512","height":"512"}},"headline":"Кросс-доменный POST-запрос в JS: Fetch без обновления","description":"Как отправить кросс-доменный POST-запрос с помощью JavaScript (Fetch или XHR) без обновления страницы. Решение ошибок CORS, blocked by cors policy, разбор ответа response.json() и настройки Access-Control-Allow-Origin.","keywords":["cors","fetch post","blocked by cors policy","кросс-доменный запрос","javascript fetch","xhr post","cors preflight","access-control-allow-origin","fetch cors","ошибка cors","ajax post"],"image":["https://xn--b1afbosiaouc3h.xn--p1ai/api/v1/question/15218/preview/1x1.png","https://xn--b1afbosiaouc3h.xn--p1ai/api/v1/question/15218/preview/4x3.png","https://xn--b1afbosiaouc3h.xn--p1ai/api/v1/question/15218/preview/16x9.png"],"articleBody":""}},{"@type":"ListItem","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/c/web/q/how-to-fix-block-not-displaying-chrome-yandex-browser","name":"Как исправить отсутствие блока в Chrome и Яндекс.Браузере","position":10,"item":{"@type":"Article","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/c/web/q/how-to-fix-block-not-displaying-chrome-yandex-browser","mainEntityOfPage":{"@type":"WebPage","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/c/web/q/how-to-fix-block-not-displaying-chrome-yandex-browser"},"inLanguage":"ru","dateCreated":"2026-03-07T14:03:18.601Z","datePublished":"2026-03-07T14:03:18.601Z","dateModified":"2026-03-07T14:03:18.601Z","author":[{"@type":"Person","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/@johndoe","name":"John Doe","givenName":"John","familyName":"Doe","url":"https://xn--b1afbosiaouc3h.xn--p1ai/@johndoe","image":{"@type":"ImageObject","url":"https://xn--b1afbosiaouc3h.xn--p1ai/api/v1/person/johndoe/avatar.png","width":"72","height":"72"},"jobTitle":"Senior Developer","description":"Опытный разработчик Java и Minecraft-моддинга с более чем 10-летним опытом в создании и отладке модов для Forge"}],"publisher":{"@type":"Organization","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/about","name":"НейроОтветы","url":"https://xn--b1afbosiaouc3h.xn--p1ai/about","logo":{"@type":"ImageObject","url":"https://xn--b1afbosiaouc3h.xn--p1ai/logo.png","width":"512","height":"512"}},"headline":"Как исправить отсутствие блока в Chrome и Яндекс.Браузере","description":"Решение проблемы с отображением элементов на сайте в Chrome и Яндекс.Браузере. Проверка консоли разработчика, CSS-префиксов, расширений и серверного кэширования. Пошаговые рекомендации для веб-разработчиков.","keywords":["Chrome","Яндекс.Браузер","Opera","Safari","CSS","JavaScript","кэширование","консоль разработчика","баги браузеров","совместимость CSS"],"image":[],"articleBody":""}}]}}]}

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

Имеется всплывающая форма, активируемая по клику на кнопку. Требуется настроить так, чтобы при повторном нажатии на кнопку открывалось окно с сообщением об успешной отправке (поскольку форма уже была заполнена ранее).

Предполагается, что решение может быть связано с сохранением данных пользователя в local storage, но механизм реализации неизвестен.

Дополнительная сложность заключается в недавнем обновлении Tilda: теперь форма автоматически закрывается после отправки и отображает сообщение об успехе без присвоения идентификатора (ID), что затрудняет отслеживание уже отправленных форм.

Для настройки формы tilda и запрета повторной отправки одним пользователем сохраните флаг успеха в localStorage через JavaScript в блоке T123. После отправки формы отслеживайте появление сообщения об успехе с помощью MutationObserver, даже если Tilda закрывает модалку автоматически без ID. При повторном клике на кнопку проверяйте localStorage и показывайте кастомное уведомление вместо формы заявки tilda.


Содержание


Почему важен запрет повторных отправок в tilda формы

Представьте: пользователь кликнул на кнопку, заполнил форму заявки tilda, отправил — и всё, база данных получила дубликат. Или хуже: спамеры жмут повторно. В tilda формы это особенно актуально для всплывающих модалок, где кнопка всегда на виду.

Запрет через localStorage решает проблему на клиенте — дешево, быстро, без серверных хаков. Но после обновления Tilda (закрытие формы + сообщение без ID) стандартные события формы не сработают. Нужно ловить DOM-изменения. Вы сэкономите трафик, нервы менеджеров и место в CRM.

А что если пользователь очистит кэш? Тогда форма вернётся — это нормально, не пытайтесь хранить вечно.


Подготовка: добавляем JavaScript в Tilda через блок T123

Сначала добавьте блок для скриптов. Откройте библиотеку блоков, найдите “Другое” и перетащите T123 на страницу с формой или кнопкой. Официальная инструкция Tilda подтверждает: туда кидайте HTML, CSS и JS — код запустится после загрузки страницы.

Почему T123, а не Zero Block? Он проще для чистого JS, без лишнего верстания. Разместите его перед формой или в футере проекта для глобального эффекта. Подробный гайд по методам рекомендует именно так для форм.

Вставьте код в поле “Контент”. Готово? Публикуйте и проверяйте консоль (F12).


Сохранение состояния формы в localStorage

LocalStorage — ваш лучший друг здесь. Он держит данные в браузере до очистки кэша, идеально для флага “форма отправлена”.

Базовый пример:

javascript
// Сохранить флаг
localStorage.setItem('tildaFormSubmitted', 'true');

// Проверить
if (localStorage.getItem('tildaFormSubmitted')) {
 console.log('Форма уже отправлена!');
}

Руководство по localStorage объясняет: данные persistent, но только на устройстве. Для tilda формы обратной связи хватит — один юзер, один девайс. Ключ назовите уникально, типа ‘myform-2026’, чтобы не конфликтовало с другими скриптами.

Очистка? Добавьте кнопку “Отправить заново” или таймер: localStorage.removeItem('key') через неделю.


Отслеживание успеха отправки без ID с MutationObserver

Вот засада обновления Tilda: форма закрывается, сообщение мелькает — и никакого удобного ID или события. MutationObserver решает: следит за изменениями DOM в модалке.

Создайте observer:

javascript
const observer = new MutationObserver((mutations) => {
 mutations.forEach((mutation) => {
 if (mutation.addedNodes.length) {
 mutation.addedNodes.forEach((node) => {
 if (node.nodeType === 1 && node.querySelector('.t-form__success')) { // Класс успеха Tilda
 localStorage.setItem('tildaFormSubmitted', 'true');
 observer.disconnect(); // Остановить слежку
 }
 });
 }
 });
});

// Запустить на модалке или body
observer.observe(document.body, { childList: true, subtree: true });

Статья про MutationObserver разбирает нюансы: ловит addedNodes, работает на subtree. Адаптируйте селектор под ваше сообщение успеха — инспектируйте DOM в F12 после отправки.

Запускайте observer при открытии модалки. Работает даже если Tilda прячет элементы.


Настройка кнопки для проверки и показа сообщения

Кнопка открытия формы — ваш триггер. Добавьте onclick или data-tilda-modal с JS-чеком.

Пример для кнопки с ID “open-form-btn”:

javascript
document.getElementById('open-form-btn').addEventListener('click', function(e) {
 if (localStorage.getItem('tildaFormSubmitted')) {
 e.preventDefault();
 showSuccessMessage(); // Ваша функция показа
 return false;
 }
 // Иначе открываем форму
});

Функция показа:

javascript
function showSuccessMessage() {
 alert('Спасибо! Ваша заявка уже отправлена ранее.'); // Или модалка
}

Для всплывающих форм Tilda используйте их API: tildaModal.open(). Интегрируйте чек перед вызовом. Если форма в Zero Block, ID генерится автоматически — найдите его.


Полный рабочий код для tilda javascript форма

Соберём всё в один скрипт для T123. Замените селекторы на свои.

html
<script>
(function() {
 const FORM_KEY = 'tildaFormSubmitted_2026';
 const BUTTON_ID = 'open-form-btn'; // ID вашей кнопки
 const SUCCESS_SELECTOR = '.t-form__success'; // Класс успеха

 // Observer для успеха
 const observer = new MutationObserver((mutations) => {
 for (let mutation of mutations) {
 for (let node of mutation.addedNodes) {
 if (node.nodeType === 1 && (node.matches(SUCCESS_SELECTOR) || node.querySelector(SUCCESS_SELECTOR))) {
 localStorage.setItem(FORM_KEY, 'true');
 observer.disconnect();
 return;
 }
 }
 }
 });

 // Проверка при клике
 document.addEventListener('DOMContentLoaded', () => {
 const btn = document.getElementById(BUTTON_ID);
 if (btn) {
 btn.addEventListener('click', (e) => {
 if (localStorage.getItem(FORM_KEY)) {
 e.preventDefault();
 // Показать модалку успеха
 const modal = document.createElement('div');
 modal.innerHTML = '<div style="position:fixed;top:50%;left:50%;transform:translate(-50%,-50%);background:white;padding:20px;border:1px solid #ccc;">Спасибо! Заявка отправлена ранее.</div>';
 document.body.appendChild(modal);
 setTimeout(() => modal.remove(), 3000);
 return false;
 }
 // Запустить observer при открытии
 observer.observe(document.body, { childList: true, subtree: true });
 });
 }
 });
})();
</script>

Тестируйте: отправьте форму, обновите страницу — кнопка покажет сообщение. Идеально для настройки формы tilda.


Тестирование настройки формы tilda и возможные проблемы

Запустите в инкогнито, очистите localStorage (F12 > Application > Local Storage). Отправьте форму — флаг сохранится? Кликните повторно — модалка успеха?

Проблемы:

  • Observer не ловит: Уточните селектор в DOM после отправки.
  • Множественные страницы: Дублируйте T123 или добавьте в настройки проекта.
  • Мобильные: LocalStorage работает, но проверьте модалки на iOS.
  • Конфликты: Уникальный ключ решает.

Официальные FAQ Tilda упоминают: код T123 выполняется после загрузки, так что DOM-ready обязателен.


Альтернативы для tilda формы обратной связи

Не фанат JS? Интегрируйте с Google Tag Manager — там теги на события форм. Или внешний сервис вроде FormKeep с webhook’ами на сервер (проверяет email/телефон).

Для pro: сохраняйте hash email’а в localStorage, чтобы юзер мог отправить с новым. Но для простых tilda формы хватит нашего подхода — 50 строк кода, ноль серверов.

Форма tilda zero block? Аналогично, только ID блока в селекторах.


Источники

  1. Примеры полезных JS-скриптов
  2. Как добавить свой HTML, CSS или Javascript-код?
  3. Как подключить JavaScript в Tilda
  4. How to Use LocalStorage in JavaScript
  5. JavaScript’s MutationObserver API

Заключение

Настройка формы tilda с запретом дубликатов через localStorage и MutationObserver — надёжный хак для 2026 года, даже после обновлений Tilda. Добавьте T123, вставьте код, протестируйте — и повторные заявки уйдут в прошлое. Если трафик большой, комбинируйте с сервером, но для старта хватит клиента. Теперь ваши tilda формы станут чище и удобнее.

Авторы
Проверено модерацией
НейроОтветы
Модерация
Tilda формы: запрет повторной отправки с JS