Как показать попап при уходе и не раздражать посетителя
На компьютере можно заметить только один полезный сигнал: курсор ушёл через верхнюю границу окна, где обычно находятся вкладки и адресная строка. Узнать, что человек точно закроет сайт, браузер не даёт. Поэтому аккуратный exit-попап срабатывает после задержки, один раз за сессию и только когда не открыты корзина, форма или другое окно. На телефоне курсора нет — обещать тот же сценарий там нельзя.
Что реально можно определить
Название «попап при закрытии сайта» обещает больше, чем умеет браузер. Страница
не получает надёжный сигнал «пользователь сейчас уйдёт навсегда». На компьютере
можно слушать mouseleave и считать вероятным уходом событие с clientY <= 0 —
курсор покинул документ через верх.
Это всего лишь предположение. Посетитель мог потянуться к соседней вкладке и вернуться. Поэтому окно должно быть предложением, а не блокировкой выхода.
Минимальные правила хорошего сценария
До разработки согласуйте пять условий:
- Через сколько секунд сценарий становится активным.
- Какой именно родной попап открыть.
- Один раз за вкладку или на более долгий срок.
- Какие состояния блокируют показ.
- Что происходит на сенсорных устройствах.
Для большинства лендингов разумная база — задержка, один показ в
sessionStorage и полный отказ от exit intent на touch-устройствах.
Когда попап показывать нельзя
Перед открытием надо проверить состояние страницы. Не показывайте предложение, если посетитель:
- уже открыл другой попап;
- заполняет форму;
- находится в корзине или оплате;
- только что успешно отправил заявку;
- ещё не успел прочитать первый экран;
- уже видел это окно в текущей сессии.
Родной попап Тильды сообщает события popupShowed и popupHidden, а корзина —
fullscreenCartOpened. Использовать эти сигналы надёжнее, чем угадывать открытое
состояние только по видимости одного элемента.
MOD-182 строится на этом контракте: активируется после задержки, реагирует только на уход через верх, проверяет занятые состояния и сохраняет флаг показа в сессии.
Почему beforeunload не подходит
beforeunload предназначен для предупреждения о несохранённых данных. Современный
браузер не даёт странице в момент закрытия показать красивый попап Тильды,
запустить форму или удержать человека своим интерфейсом. Попытка использовать
это событие даёт нестабильный системный диалог и ухудшает доверие.
Также не стоит открывать окно после любого движения мыши вверх. На обычной
странице человек постоянно попадает курсором в верхнюю область — например,
переходя к меню. Значение clientY <= 0, задержка и флаг сессии нужны вместе.
Что делать на мобильном
На телефоне нет движения курсора за границу окна. Можно придумать другой триггер: длительное бездействие, глубину просмотра, возврат вверх или нажатие системной кнопки назад в рамках собственной навигации. Но это уже не exit intent.
Не включайте таймер автоматически только ради одинаковой статистики устройств. Мобильный посетитель получит внезапное окно во время чтения, хотя не собирался уходить. Если маркетинговый сценарий нужен и на телефоне, проектируйте его отдельно и называйте по реальному условию показа.
Содержание важнее триггера
Exit-попап не должен повторять первый экран. У него есть смысл, когда он снимает конкретное последнее сомнение:
- сохранить подборку или расчёт;
- получить чек-лист по теме страницы;
- задать вопрос по сложному выбору;
- увидеть условия доставки или гарантии;
- оставить почту для сохранения результата.
Скидка «потому что вы уходите» учит постоянных посетителей имитировать уход. Дизайнеру полезнее согласовать с клиентом одно ясное действие и короткий текст, чем бесконечно настраивать чувствительность курсора.
Проверка перед сдачей
- Окно не появляется раньше заданной задержки.
- Уход влево, вправо и вниз ничего не делает.
- Второй уход в той же вкладке не открывает окно снова.
- Открытые попап, корзина и форма блокируют сценарий.
- После блокировки окно не возникает внезапно через секунду.
- На телефоне exit-обработчик не подключён.
- Закрытие сохраняет родной возврат фокуса к вызывающему элементу.
В отчёте клиенту напишите не «показывается при закрытии», а точное условие: «один раз за сессию после N секунд при уходе курсора через верх окна». Так аналитика и ожидания совпадут с реальным поведением.