Окно: событие beforeunload
Базовая линия Широко поддерживается *
Эта функция хорошо зарекомендовала себя и работает на многих устройствах и версиях браузера. Она доступна в браузерах с июля 2015 года.
* Некоторые части этой функции могут иметь различный уровень поддержки.
Событие beforeunload срабатывает, когда текущее окно, содержащий документ и связанные ресурсы собираются загрузить. В этот момент документ все еще виден, и событие все еще может быть отменено.
Основной случай использования этого события — запуск диалогового окна подтверждения, генерируемого браузером, которое просит пользователей подтвердить, действительно ли они хотят покинуть страницу при попытке её закрытия, перезагрузки или перехода на другую страницу. Это призвано предотвратить потерю несохранённых данных.
Диалоговое окно может быть запущено следующими способами:
- Вызов метода
preventDefault()объекта события. - Установление свойства
returnValueобъекта события в значение отличное от пустой строки или любое другое истинное значение. - Возвращение любого истинного значения из функции обработчика событий, например,
return "string". Обратите внимание, что это работает только в том случае, если функция подключена через свойствоonbeforeunload, а не через методaddEventListener(). Это поведение сохраняется в современных версиях Firefox, Safari и Chrome.
Последние два механизма являются устаревшими функциями; лучшей практикой является запуск диалогового окна вызовом preventDefault() на объекте события, а также установление значения returnValue для поддержки устаревших случаев.
Синтаксис
Используйте имя события в методах, таких как addEventListener(), или установите свойство обработчика событий.
addEventListener("beforeunload", (event) => {});
onbeforeunload = (event) => {};
Тип события
A BeforeUnloadEvent. Наследуется от Event.
Примечания по использованию
Для отображения диалогового окна при закрытии или переходе на вкладку функция обработчика события beforeunload должна вызвать preventDefault() на объекте события. Следует отметить, что современные реализации:
- Требуют прилипающей активации для отображения диалогового окна. Другими словами, браузер отобразит диалоговое окно только если кадр или любой встроенный кадр получит действие пользователя или взаимодействие с пользователем. Если пользователь никогда не взаимодействовал со страницей, то нет данных пользователя для сохранения, поэтому нет законного случая для диалогового окна.
- Показывает только строку, заданную браузером, в отображаемом диалоговом окне. Его невозможно контролировать с помощью кода веб-страницы.
Событие beforeunload страдает от некоторых проблем:
-
Он не срабатывает надёжно, особенно в мобильных платформах. Например, событие
beforeunloadвообще не срабатывает в следующем сценарии:- Мобильный пользователь посещает вашу страницу.
- Пользователь переключается на другое приложение.
- Позже пользователь закрывает браузер из диспетчера приложений.
Примечание: Рекомендуется использовать событие
visibilitychangeв качестве более надёжного сигнала для автоматического сохранения состояния приложения, которое решает проблемы, подобные описанным выше. См. Don't lose user and app state, use Page Visibility для получения более подробной информации. -
В Firefox,
beforeunloadне совместим с кешем вперёд/назад (bfcache): то есть Firefox не поместит страницы в bfcache, если они имеютbeforeunloadслушателей, что плохо сказывается на производительности.
Поэтому рекомендуется, чтобы разработчики слушали beforeunload только когда пользователи имеют несохранённые изменения, чтобы диалоговое окно, упомянутое выше, могло предупредить их о предстоящей потере данных, и удалить слушатель снова, когда это не нужно. Редкое прослушивание beforeunload может свести к минимуму влияние на производительность.
Псевдонимы обработчиков событий
В дополнение к интерфейсу Window свойство обработчика событий onbeforeunload также доступно для следующих целей:
Примеры
В следующем примере у нас есть текстовый HTML <input> для представления данных, которые могут быть изменены и требуют сохранения:
<form> <input type="text" name="name" id="name" /> </form>
Наш JavaScript подключает слушатель события input к элементу <input>, который отслеживает изменения в введённом значении. При обновлении значения на значение, отличное от пустого, слушатель события beforeunload подключается к объекту Window.
Если значение снова становится пустой строкой (т. е. значение удаляется), слушатель события beforeunload удаляется снова — как указано выше в Примечаниях к использованию, слушатель должен быть удалён, когда не сохраняются данные, о которых нужно предупреждать.
Функция обработчика события beforeunload вызывает event.preventDefault() для запуска диалогового окна предупреждения при закрытии или переходе на вкладку. Мы также включили event.returnValue = true в функцию обработчика, чтобы любые браузеры, которые не поддерживают механизм event.preventDefault(), всё ещё могли корректно выполнять демонстрацию.
const beforeUnloadHandler = (event) => {
// Recommended
event.preventDefault();
// Included for legacy support, e.g. Chrome/Edge < 119
event.returnValue = true;
};
const nameInput = document.querySelector("#name");
nameInput.addEventListener("input", (event) => {
if (event.target.value !== "") {
window.addEventListener("beforeunload", beforeUnloadHandler);
} else {
window.removeEventListener("beforeunload", beforeUnloadHandler);
}
});
Когда значение <input> не пустое, при попытке закрытия, перехода или перезагрузки страницы браузер отображает диалоговое окно предупреждения. Попробуйте:
Спецификации
Совместимость с браузерами
| Рабочий стол | Мобильный | ||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|
| Chrome | Edge | Firefox | Opera | Safari | Chrome Android | Firefox для Android | Opera Android | Safari на IOS | Samsung Internet | WebView Android | |
beforeunload_event |
1 | 12 | 1 | 12 | 3 | 18 | 4 | 12 | 1 | 1.0 | 4.4 |
event_returnvalue_activation |
11930–119Перед Chrome 119, пустая строка неправильно активировала диалоговое окно подтверждения. |
11979–119Перед Edge 119, пустая строка неправильно активировала диалоговое окно подтверждения. |
6 | 10517–105Перед Opera 105, пустая строка неправильно активировала диалоговое окно подтверждения. |
8 | 11930–119Перед Chrome Android 119, пустая строка неправильно активировала диалоговое окно подтверждения. |
6 | 7918–79Перед Opera Android 79, пустая строка неправильно активировала диалоговое окно подтверждения. |
Нет | 25.02.0–25.0Перед Samsung Internet 25.0, пустая строка неправильно активировала диалоговое окно подтверждения. |
1194.4–119Перед WebView Android 119, пустая строка неправильно активировала диалоговое окно подтверждения. |
generic_string_displayed |
51 | 12 | 44 | 38 | 9.1 | 51 | 44 | 41 | 9.3 | 5.0 | 51 |
preventdefault_activation |
119 | 11912–79 | 6 | 105 | 11 | 119 | 6 | 79 | Нет | 25.0 | 119 |
return_string_activation |
1 | 12 | 1 | 12 | 3 | 18 | 4 | 12 | Нет | 1.0 | 4.4 |
См. также
-
BeforeUnloadEventинтерфейс - Связанные события:
- API жизненного цикла страницы предоставляет более полезные рекомендации по обработке поведения жизненного цикла страницы в ваших веб-приложениях.
© 2005–2024 MDN contributors.
Licensed under the Creative Commons Attribution-ShareAlike License v2.5 or later.
https://developer.mozilla.org/en-US/docs/Web/API/Window/beforeunload_event