Skip to main content

Що робить подія beforeunload?

Визначення

beforeunload - це подія, яка спрацьовує перед вивантаженням (unload) поточної сторінки з пам'яті браузера. Вона виникає, коли користувач:

  • закриває вкладку або вікно,
  • перезавантажує сторінку,
  • переходить за посиланням або вводить новий URL.

1. Простий приклад

javascript
window.addEventListener('beforeunload', (event) => { event.preventDefault(); event.returnValue = ''; // обов'язково! });

Після цього браузер покаже діалог підтвердження виходу:

Ви дійсно хочете залишити сторінку? Введені дані можуть бути втрачені.

Важливо:

  • Сучасні браузери не дозволяють задавати власний текст у цьому вікні. (раніше можна було event.returnValue = 'Ви впевнені?', але зараз це ігнорується).
  • Це зроблено з міркувань безпеки та UX - щоб сайти не могли "шантажувати" користувача ("залишайтесь з нами!").

2. Коли використовувати

Використовується, якщо користувач може втратити незбережені зміни, наприклад:

  • редагує текст, але не натиснув "Зберегти";
  • заповнює форму;
  • пише коментар;
  • робить щось у застосунку з незбереженим станом.
javascript
let formChanged = false; document.querySelector('form').addEventListener('input', () => { formChanged = true; }); window.addEventListener('beforeunload', (e) => { if (formChanged) { e.preventDefault(); e.returnValue = ''; } });

Тепер, якщо користувач змінив форму і намагається піти, з'явиться попередження.

3. Приклад без попередження (просто "hook" перед виходом)

Якщо потрібно просто виконати очищення чи логіку перед вивантаженням (без діалогу):

javascript
window.addEventListener('beforeunload', () => { localStorage.setItem('lastVisited', new Date().toISOString()); });

Ця подія - остання точка, де можна зберегти дані у localStorage чи sessionStorage.

4. Різниця між beforeunload та unload

ПодіяКоли спрацьовуєЧи можна зупинити вихід?Коли використовувати
beforeunloadПеред вивантаженнямТак (через preventDefault())Попередження про незбережені дані
unloadПісля початку вивантаженняНіОчищення, аналітика, логування

Обмеження

  • Не можна використовувати alert() чи confirm() всередині beforeunload - браузери блокують.
  • Не варто виконувати асинхронні операції (запити, fetch) - вони не встигнуть завершитись.
  • Працює тільки у вікні/вкладці браузера, не у фреймах.
  • Краще не використовувати без потреби - UX-спам.

Підсумок

Що робитьПодія beforeunload
Коли спрацьовуєПеред тим, як користувач покине сторінку
Для чого потрібнаПопередити про втрату незбережених даних
Як зупинитиevent.preventDefault() + event.returnValue = ''
Власний текстНе можна (браузер покаже стандартний)
Коли не підходитьДля асинхронних дій - не встигнуть виконатись

Запам'ятай просто: beforeunload - це "останній шанс" сказати браузеру: "Стій! У користувача є незбережені дані."

Коротка відповідь

Для співбесіди
Premium

Коротка відповідь допоможе вам впевнено відповідати на цю тему під час співбесіди.