\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/how-to-display-order-number-tilda-thank-you-page","name":"Tilda: номер заказа на странице Спасибо после оплаты","position":1,"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/optimize-javascript-tabs-event-delegation","name":"Оптимизация вкладок JS: делегирование и data-атрибуты","position":2,"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/russian-characters-cookie-utf8-encoding","name":"Как правильно установить кодировку UTF-8 для cookie с русским текстом","position":3,"item":{"@type":"Article","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/c/web/q/russian-characters-cookie-utf8-encoding","mainEntityOfPage":{"@type":"WebPage","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/c/web/q/russian-characters-cookie-utf8-encoding"},"inLanguage":"ru","dateCreated":"2025-12-26T06:45:39.915Z","datePublished":"2025-12-26T06:45:39.915Z","dateModified":"2025-12-26T06:45:39.915Z","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":"Как правильно установить кодировку UTF-8 для cookie с русским текстом","description":"Решение проблемы с отображением русских символов в cookie. Узнайте, как правильно установить кодировку UTF-8 для cookie с кириллическими символами в JavaScript, PHP и Java.","keywords":["русские символы cookie","cookie encoding","utf8 cookie","cookie encode","UTF-8 cookie"],"image":[],"articleBody":""}},{"@type":"ListItem","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/c/web/q/slider-peek-effect-swiper-slick-owl-responsive","name":"Слайдер с эффектом peek: Swiper, Slick, Owl адаптивно","position":4,"item":{"@type":"Article","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/c/web/q/slider-peek-effect-swiper-slick-owl-responsive","mainEntityOfPage":{"@type":"WebPage","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/c/web/q/slider-peek-effect-swiper-slick-owl-responsive"},"inLanguage":"ru","dateCreated":"2026-01-16T06:45:56.743Z","datePublished":"2026-01-16T06:45:56.743Z","dateModified":"2026-01-16T06:45:56.743Z","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":"Слайдер с эффектом peek: Swiper, Slick, Owl адаптивно","description":"Реализуйте адаптивный слайдер с эффектом peek на Swiper, Slick, Owl Carousel. Настройки slidesPerView, centeredSlides, spaceBetween, breakpoints для мобильных (3 слайда) и десктопов. Формулы расчета ширин и примеры кода.","keywords":["слайдер peek","swiper peek","slick slider peek","owl stagePadding","адаптивный слайдер","slidesPerView","centeredSlides","centerPadding","swiper breakpoints","слайдер html css","карусель с peek"],"image":[],"articleBody":""}},{"@type":"ListItem","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/c/web/q/fix-cart-total-recalculation-item-deletion-checkout","name":"Как исправить пересчёт суммы заказа в корзине при удалении товара","position":5,"item":{"@type":"Article","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/c/web/q/fix-cart-total-recalculation-item-deletion-checkout","mainEntityOfPage":{"@type":"WebPage","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/c/web/q/fix-cart-total-recalculation-item-deletion-checkout"},"inLanguage":"ru","dateCreated":"2026-01-09T07:16:09.502Z","datePublished":"2026-01-09T07:16:09.502Z","dateModified":"2026-01-25T07:04:59.102Z","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":"Как исправить пересчёт суммы заказа в корзине при удалении товара","description":"Исправляем проблему: итоговая сумма заказа не обновляется при удалении товара на объединённой странице корзины и оформления. Серверный пересчёт скидок, доставки, налогов, AJAX/JS клиентская логика, примеры для Bitrix и WooCommerce.","keywords":["пересчёт суммы заказа","оформление заказа","корзина покупок","удаление товара","корзина не обновляется","AJAX корзина","Bitrix корзина","WooCommerce корзина","пересчет корзины"],"image":[],"articleBody":""}},{"@type":"ListItem","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/c/web/q/how-to-remove-autocomplete-highlighting-input-fields","name":"Как убрать выделение автозаполнения в input полях","position":6,"item":{"@type":"Article","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/c/web/q/how-to-remove-autocomplete-highlighting-input-fields","mainEntityOfPage":{"@type":"WebPage","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/c/web/q/how-to-remove-autocomplete-highlighting-input-fields"},"inLanguage":"ru","dateCreated":"2026-04-01T10:25:34.533Z","datePublished":"2026-04-01T10:25:34.533Z","dateModified":"2026-04-04T10:40:37.616Z","author":[{"@type":"Person","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/@community","name":"Community","givenName":"Community","url":"https://xn--b1afbosiaouc3h.xn--p1ai/@community","jobTitle":"Сообщество","description":"Фоновый процесс, который помогает поддерживать чистоту сайта. Выполняет такие задачи, как случайное поднятие старых безответных вопросов, владение вопросами и ответами сообщества, владение голосами против спама/злых постов, которые удаляются навсегда, и владение предложенными правками от анонимных пользователей"},{"@type":"Person","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/@peter","name":"Peter","givenName":"Peter","url":"https://xn--b1afbosiaouc3h.xn--p1ai/@peter","jobTitle":"Старший разработчик","description":"Участник сообщества Stack Overflow, специализируется на .NET и C#"},{"@type":"Organization","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/@stackoverflow-com","name":"Stack Overflow","description":"Вопросы и ответы для профессиональных программистов","url":"https://xn--b1afbosiaouc3h.xn--p1ai/@stackoverflow-com","logo":{"@type":"ImageObject","url":"https://xn--b1afbosiaouc3h.xn--p1ai/api/v1/source/stackoverflow-com/logo.png","width":"72","height":"72"}},{"@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"}}],"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":"Как убрать выделение автозаполнения в input полях","description":"Кроссбраузерное решение для удаления подсветки автозаполнения в полях input. CSS-псевдоклассы, атрибуты autocomplete и JavaScript методы.","keywords":["стилизация input","chrome автозаполнение","firefox автозаполнение","input автозаполнение","css псевдоклассы","autocomplete атрибут","javascript решения","кроссбраузерное решение","удаление подсветки","webkit-autofill","moz-autofill","ms-input-auto-fill"],"image":[],"articleBody":""}},{"@type":"ListItem","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/c/web/q/ios-safari-keyboard-viewport-fix","name":"iOS: как заставить Safari менять viewport при фокусе","position":7,"item":{"@type":"Article","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/c/web/q/ios-safari-keyboard-viewport-fix","mainEntityOfPage":{"@type":"WebPage","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/c/web/q/ios-safari-keyboard-viewport-fix"},"inLanguage":"ru","dateCreated":"2026-01-03T09:28:44.223Z","datePublished":"2026-01-03T09:28:44.223Z","dateModified":"2026-01-03T09:28:44.223Z","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":"iOS: как заставить Safari менять viewport при фокусе","description":"Почему iOS‑клавиатура в Safari на iPhone не ресайзит layout‑viewport и как это исправить: Visual Viewport API, вычисление --vh, padding‑bottom, scrollIntoView и fallback‑паттерны.","keywords":["ios клавиатура","safari iphone","visual viewport api","visualViewport","--vh","100vh","fixed панель","scrollIntoView","высота клавиатуры","padding-bottom"],"image":[],"articleBody":""}},{"@type":"ListItem","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/c/web/q/how-to-change-styles-vk-iframe-elements","name":"Как изменить стили элементов iframe с видео ВКонтакте","position":8,"item":{"@type":"Article","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/c/web/q/how-to-change-styles-vk-iframe-elements","mainEntityOfPage":{"@type":"WebPage","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/c/web/q/how-to-change-styles-vk-iframe-elements"},"inLanguage":"ru","dateCreated":"2026-03-08T06:48:13.494Z","datePublished":"2026-03-08T06:48:13.494Z","dateModified":"2026-03-08T07:19:41.273Z","author":[{"@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/@duddeniska","name":"duddeniska","givenName":"duddeniska","url":"https://xn--b1afbosiaouc3h.xn--p1ai/@duddeniska","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/@toster-ru","name":"Toster","description":"Вопросы и ответы для разработчиков и IT-специалистов","url":"https://xn--b1afbosiaouc3h.xn--p1ai/@toster-ru"},{"@type":"Organization","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/@qna-habr-com","name":"Habr Q&A","description":"Российская платформа вопросов и ответов для IT-специалистов и энтузиастов технологий","url":"https://xn--b1afbosiaouc3h.xn--p1ai/@qna-habr-com","logo":{"@type":"ImageObject","url":"https://xn--b1afbosiaouc3h.xn--p1ai/api/v1/source/qna-habr-com/logo.png","width":"72","height":"72"}},{"@type":"Organization","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/@searchengines-guru","name":"Searchengines.guru","description":"Крупнейший русскоязычный форум и новостной сайт, посвященный поисковой оптимизации, продвижению сайтов, интернет-маркетингу, работе с контекстной рекламой, монетизации трафика, сайтостроению","url":"https://xn--b1afbosiaouc3h.xn--p1ai/@searchengines-guru","logo":{"@type":"ImageObject","url":"https://xn--b1afbosiaouc3h.xn--p1ai/api/v1/source/searchengines-guru/icon.png","width":"72","height":"72"}},{"@type":"Organization","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/@vk-com","name":"VK","description":"Крупнейшая европейская социальная сеть с более чем 100 миллионами активных пользователей. Цель - поддерживать связь между старыми друзьями, одноклассниками, соседями и коллегами.","url":"https://xn--b1afbosiaouc3h.xn--p1ai/@vk-com","logo":{"@type":"ImageObject","url":"https://xn--b1afbosiaouc3h.xn--p1ai/api/v1/source/vk-com/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":"Как изменить стили элементов iframe с видео ВКонтакте","description":"Объяснение, почему невозможно изменить стили элементов управления внутри iframe с видео ВКонтакте из-за ограничений безопасности браузеров и альтернативные решения.","keywords":["iframe стили","iframe стиль","iframe вконтакте","вконтакте iframe","iframe css","стилизация iframe","доступ к элементам iframe","изменение стилей во внешнем фрейме","встраивание видео вконтакте","кастомные стили iframe","same-origin policy","ограничения iframe","css iframe","javascript iframe","видео вконтакте"],"image":[],"articleBody":""}},{"@type":"ListItem","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/c/web/q/javascript-settimeout-delay-between-savefile-runbatch","name":"setTimeout JavaScript: задержка между SaveData и RunFile","position":9,"item":{"@type":"Article","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/c/web/q/javascript-settimeout-delay-between-savefile-runbatch","mainEntityOfPage":{"@type":"WebPage","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/c/web/q/javascript-settimeout-delay-between-savefile-runbatch"},"inLanguage":"ru","dateCreated":"2026-02-27T15:24:59.934Z","datePublished":"2026-02-27T15:24:59.934Z","dateModified":"2026-02-27T15:24:59.934Z","author":[{"@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":"Organization","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/@learn-javascript-ru","name":"learn.javascript.ru","description":"Бесплатный интерактивный учебник по современному JavaScript с примерами и задачами, охватывающий основы, тонкости и фишки языка и DOM","url":"https://xn--b1afbosiaouc3h.xn--p1ai/@learn-javascript-ru","logo":{"@type":"ImageObject","url":"https://xn--b1afbosiaouc3h.xn--p1ai/api/v1/source/learn-javascript-ru/logo.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":"Person","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/@estet","name":"@estet","url":"https://xn--b1afbosiaouc3h.xn--p1ai/@estet","jobTitle":"Разработчик","description":"Активный участник Stack Overflow на русском с экспертизой в C#, JavaScript, .NET, Delphi; 545 репутации, 9 ответов"},{"@type":"Person","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/@sega057","name":"Саша Черных","givenName":"Саша","familyName":"Черных","url":"https://xn--b1afbosiaouc3h.xn--p1ai/@sega057","jobTitle":"Разработчик","description":"Участник Stack Overflow на русском с интересом к JavaScript; 21 репутация, 1 ответ"},{"@type":"Person","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/@autocrab","name":"@autocrab","url":"https://xn--b1afbosiaouc3h.xn--p1ai/@autocrab","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":"Person","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/@alexey-golubev","name":"Алексей Голубев","givenName":"Алексей","familyName":"Голубев","url":"https://xn--b1afbosiaouc3h.xn--p1ai/@alexey-golubev","jobTitle":"Разработчик","description":"Автор примеров кода на CodeNet.ru"},{"@type":"Organization","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/@www-codenet-ru","name":"CodeNet.ru","description":"Сайт с статьями, исходниками и примерами кода для веб-разработки и программирования","url":"https://xn--b1afbosiaouc3h.xn--p1ai/@www-codenet-ru"},{"@type":"Person","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/@ionden","name":"Денис Инешин","givenName":"Денис","familyName":"Инешин","url":"https://xn--b1afbosiaouc3h.xn--p1ai/@ionden","image":{"@type":"ImageObject","url":"https://xn--b1afbosiaouc3h.xn--p1ai/api/v1/person/ionden/avatar.png","width":"72","height":"72"},"jobTitle":"JavaScript разработчик","description":"JavaScript-разработчик в Booking.com, автор open-source проектов на ionden.com, значительный вклад в теги JavaScript, HTML, CSS (3074 ответа, 33% решений)"},{"@type":"Person","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/@k12th","name":"Константин Китманов","givenName":"Константин","familyName":"Китманов","url":"https://xn--b1afbosiaouc3h.xn--p1ai/@k12th","image":{"@type":"ImageObject","url":"https://xn--b1afbosiaouc3h.xn--p1ai/api/v1/person/k12th/avatar.png","width":"72","height":"72"},"jobTitle":"Разработчик","description":"Активный участник Хабр Q&A с вкладом в JavaScript, Node.js, HTML, разработку игр, npm, CSS (1745 ответов, 34% решений)"},{"@type":"Organization","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/@qna-habr-com","name":"Habr Q&A","description":"Российская платформа вопросов и ответов для IT-специалистов и энтузиастов технологий","url":"https://xn--b1afbosiaouc3h.xn--p1ai/@qna-habr-com","logo":{"@type":"ImageObject","url":"https://xn--b1afbosiaouc3h.xn--p1ai/api/v1/source/qna-habr-com/logo.png","width":"72","height":"72"}},{"@type":"Person","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/@streletz","name":"@streletz","url":"https://xn--b1afbosiaouc3h.xn--p1ai/@streletz","jobTitle":"Разработчик","description":"Участник Stack Overflow на русском"}],"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":"setTimeout JavaScript: задержка между SaveData и RunFile","description":"Как реализовать задержку setTimeout javascript между вызовами функций SaveData() для сохранения файла javascript через ActiveXObject и RunFile() для wscript shell run batch-файла при клике на кнопку. Полный пример кода, альтернативы и отладка для js settimeout.","keywords":["settimeout","settimeout javascript","js settimeout","файл javascript","javascript сохранить файл","wscript shell","wscript shell run","activexobject","settimeout задержка"],"image":[],"articleBody":""}},{"@type":"ListItem","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/c/web/q/how-to-prevent-text-selection-html-css","name":"Полная блокировка выделения текста в HTML с помощью CSS","position":10,"item":{"@type":"Article","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/c/web/q/how-to-prevent-text-selection-html-css","mainEntityOfPage":{"@type":"WebPage","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/c/web/q/how-to-prevent-text-selection-html-css"},"inLanguage":"ru","dateCreated":"2026-03-20T14:32:15.285Z","datePublished":"2026-03-20T14:32:15.285Z","dateModified":"2026-03-20T14:32:15.285Z","author":[{"@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/@blowsie","name":"Blowsie","givenName":"Blowsie","url":"https://xn--b1afbosiaouc3h.xn--p1ai/@blowsie","jobTitle":"Разработчик","description":"Опытный разработчик с большим опытом работы с веб-технологиями"},{"@type":"Person","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/@tim-down","name":"Tim Down","givenName":"Tim","familyName":"Down","url":"https://xn--b1afbosiaouc3h.xn--p1ai/@tim-down","jobTitle":"Разработчик","description":"Участник сообщества Stack Overflow, автор решений по JavaScript и веб-технологиям"},{"@type":"Person","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/@zectbynmo","name":"ZECTBynmo","givenName":"ZECTBynmo","url":"https://xn--b1afbosiaouc3h.xn--p1ai/@zectbynmo","jobTitle":"Разработчик","description":"Участник сообщества Stack Overflow, автор решений по улучшению пользовательского интерфейса"},{"@type":"Person","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/@kaz","name":"Kaz","givenName":"Kaz","url":"https://xn--b1afbosiaouc3h.xn--p1ai/@kaz","jobTitle":"Разработчик","description":"Участник сообщества Stack Overflow, автор практических решений по CSS"},{"@type":"Person","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/@chriscoyier","name":"Chris Coyier","givenName":"Chris","familyName":"Coyier","url":"https://xn--b1afbosiaouc3h.xn--p1ai/@chriscoyier","image":{"@type":"ImageObject","url":"https://xn--b1afbosiaouc3h.xn--p1ai/api/v1/person/chriscoyier/avatar.png","width":"72","height":"72"},"jobTitle":"Технический писатель","description":"Основатель CSS-Tricks, эксперт в области веб-разработки"}],"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 с помощью CSS","description":"Комплексные методы предотвращения выделения и копирования HTML-блока с помощью CSS, включая user-select none и JavaScript решения для полной защиты.","keywords":["user select none","запретить копирование текста","pointer events none","webkit user select none","css запретить выделение текста","html запретить выделение","user-select","pointer-events","защита контента","кроссбраузерная совместимость","javascript защита от копирования","css user select"],"image":[],"articleBody":""}}]}}]}
Веб

Tilda формы: запрет повторной отправки с JS

Настройка формы Tilda для запрета дубликатов: используйте localStorage и MutationObserver. Пошаговый гайд по добавлению JS в блок T123, отслеживанию успеха отправки без ID и показу сообщения при повторном клике. Идеально для форм заявок и всплывающих модалок.

1 ответ 15 просмотров

Как реализовать запрет на повторное заполнение формы одним пользователем на 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