\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/ios-safari-keyboard-viewport-fix","name":"iOS: как заставить Safari менять viewport при фокусе","position":2,"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/javascript-settimeout-delay-between-savefile-runbatch","name":"setTimeout JavaScript: задержка между SaveData и RunFile","position":3,"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":"Илья Кантор","givenName":"Илья","familyName":"Кантор","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"},{"@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":"Открытый справочник Mozilla по веб-технологиям (HTML, CSS, JavaScript, API) с руководствами, примерами, спецификациями и данными о совместимости браузеров, поддерживаемый сообществом.","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 для вопросов и ответов программистов и IT-специалистов","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":"Хабр 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/smooth-background-change-on-scroll-javascript","name":"Плавная смена фона при скролле в JavaScript без резких переходов","position":4,"item":{"@type":"Article","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/c/web/q/smooth-background-change-on-scroll-javascript","mainEntityOfPage":{"@type":"WebPage","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/c/web/q/smooth-background-change-on-scroll-javascript"},"inLanguage":"ru","dateCreated":"2026-01-02T13:45:04.795Z","datePublished":"2026-01-02T13:45:04.795Z","dateModified":"2026-01-02T13:45:04.795Z","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":"Плавная смена фона при скролле в JavaScript без резких переходов","description":"Как сделать плавную анимацию смены статичного фонового изображения при скролле: используйте слои с opacity, CSS transitions, Vanilla JS с requestAnimationFrame или GSAP ScrollTrigger. Примеры кода для fade-эффекта без лагов.","keywords":["плавная смена фона","анимация при скролле","смена фона при скролле","GSAP ScrollTrigger","css opacity transition","javascript scroll","анимация фона","плавный скролл","смена backgroundImage","IntersectionObserver"],"image":[],"articleBody":""}},{"@type":"ListItem","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/c/web/q/vue-js-custom-rendering-console-vue-termui","name":"Настройка рендеринга Vue.js в консоль с vue-termui","position":5,"item":{"@type":"Article","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/c/web/q/vue-js-custom-rendering-console-vue-termui","mainEntityOfPage":{"@type":"WebPage","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/c/web/q/vue-js-custom-rendering-console-vue-termui"},"inLanguage":"ru","dateCreated":"2025-12-24T09:26:52.001Z","datePublished":"2025-12-24T09:26:52.001Z","dateModified":"2025-12-24T09:26:52.001Z","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":"Настройка рендеринга Vue.js в консоль с vue-termui","description":"Как использовать createRenderer для нестандартного рендеринга Vue.js в терминале. Примеры с vue-termui, обработка stdin/stdout, события и типичные ошибки. Готовые решения для консольного UI.","keywords":["vue termui","vue custom renderer","vue консоль","createRenderer","vue terminal","vue js рендеринг","vue-termui","vue 3 renderer","консольный рендерер vue"],"image":[],"articleBody":""}},{"@type":"ListItem","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/c/web/q/russian-characters-cookie-utf8-encoding","name":"Как правильно установить кодировку UTF-8 для cookie с русским текстом","position":6,"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/merge-two-arrays-objects-javascript-by-id","name":"Объединение двух массивов объектов в JavaScript по id","position":7,"item":{"@type":"Article","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/c/web/q/merge-two-arrays-objects-javascript-by-id","mainEntityOfPage":{"@type":"WebPage","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/c/web/q/merge-two-arrays-objects-javascript-by-id"},"inLanguage":"ru","dateCreated":"2026-02-10T09:26:15.296Z","datePublished":"2026-02-10T09:26:15.296Z","dateModified":"2026-02-11T16:06:05.332Z","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":"Объединение двух массивов объектов в JavaScript по id","description":"Эффективные методы объединения двух массивов объектов в JavaScript на основе общего свойства id. Добавление комментариев к цветам с использованием reduce(), Map() и других подходов.","keywords":["javascript массивы","javascript объединить","javascript merge arrays","javascript массив объектов","javascript добавить в массив","javascript объединить объекты","javascript reduce","javascript map","javascript comments","javascript colors","javascript id property"],"image":[],"articleBody":""}},{"@type":"ListItem","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/c/web/q/servicepipe-js-localhost-scan-kaspersky-hang","name":"Servicepipe JS сканирует localhost и зависает с Kaspersky","position":8,"item":{"@type":"Article","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/c/web/q/servicepipe-js-localhost-scan-kaspersky-hang","mainEntityOfPage":{"@type":"WebPage","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/c/web/q/servicepipe-js-localhost-scan-kaspersky-hang"},"inLanguage":"ru","dateCreated":"2026-01-04T06:28:01.095Z","datePublished":"2026-01-04T06:28:01.095Z","dateModified":"2026-01-04T06:35:14.269Z","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":"Servicepipe JS сканирует localhost и зависает с Kaspersky","description":"Почему скрипт Servicepipe.ru сканирует localhost (RDP, VNC), вызывает зависание сайта и ошибки с Kaspersky Endpoint Security? Легитимная DDoS защита или угроза? Анализ обфусцированного JS, диагностика конфликта, меры блокировки CSP и uBlock.","keywords":["kaspersky endpoint security","servicepipe","сканирование localhost","защита от ddos","обфусцированный javascript","локальные порты","kaspersky блокировка","ddos cybert","анализ js","csp блокировка","ublock origin","threatmetrix"],"image":[],"articleBody":""}},{"@type":"ListItem","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/c/web/q/woocommerce-switch-product-cards-by-color-without-variations","name":"Переключение карточек товаров по цвету в WooCommerce без вариаций","position":9,"item":{"@type":"Article","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/c/web/q/woocommerce-switch-product-cards-by-color-without-variations","mainEntityOfPage":{"@type":"WebPage","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/c/web/q/woocommerce-switch-product-cards-by-color-without-variations"},"inLanguage":"ru","dateCreated":"2026-01-17T12:18:49.115Z","datePublished":"2026-01-17T12:18:49.115Z","dateModified":"2026-01-17T12:18:49.115Z","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":"Переключение карточек товаров по цвету в WooCommerce без вариаций","description":"Как реализовать свитчинг карточек товаров при выборе цвета обуви в WooCommerce без вариативных продуктов. Meta-поля, хуки, AJAX и JS для динамического каталога как на маркетплейсах. SEO-дружественный подход с примерами кода.","keywords":["woocommerce","переключение карточек товаров","цвет обуви","без вариативных продуктов","ajax woocommerce","хуки woocommerce","woocommerce товары","цвет товара","вариация woocommerce","woocommerce карточки товара","woocommerce variation"],"image":[],"articleBody":""}},{"@type":"ListItem","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/c/web/q/bitrix-dynamic-delivery-price","name":"Bitrix: динамическая стоимость доставки в sale.order.ajax","position":10,"item":{"@type":"Article","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/c/web/q/bitrix-dynamic-delivery-price","mainEntityOfPage":{"@type":"WebPage","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/c/web/q/bitrix-dynamic-delivery-price"},"inLanguage":"ru","dateCreated":"2025-12-31T06:29:10.455Z","datePublished":"2025-12-31T06:29:10.455Z","dateModified":"2025-12-31T06:29:10.455Z","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":"Bitrix: динамическая стоимость доставки в sale.order.ajax","description":"Как в Bitrix (sale.order.ajax) задать цену доставки: передать зону из JS, посчитать в calculateConcrete и вернуть через setPrice, затем вызвать пересчёт заказа.","keywords":["Bitrix доставка","sale.order.ajax","calculateConcrete","динамическая стоимость доставки","установка цены доставки","BX.Sale.OrderAjax","$result->setPrice","пересчёт заказа"],"image":[],"articleBody":""}}]}}]}
Веб

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

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

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

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