beforeunload
и unload
запускаются, когда активная страница уничтожается, потому что она удалена или закрывается браузер.
pagehide
запускается, когда активная страница«приостановлен», например, на диск.
Если браузер закрыт, а страница приостановлена, он может никогда не получить события beforeunload
или unload
.
pagehide
была введена потому, что производители браузеров пытались приостановить и возобновить страницы для кэширования (вместо их перезагрузки), но обнаружили, что когда они вызывают событие unload
, многие страницы предпринимают разрушительные действия, которые не позволяют страницевозобновляется позже.Таким образом, они придумали pagehide
в качестве аналогичной, но другой альтернативы.
Я понимаю, что это «ПЛОХАЯ ПРАКТИКА» для сохранения данных о событиях выгрузки
Я не уверен в этом ... Это плохая практика делать синхронные запросы на unload
, потому что это заставит браузер ждать ответа в тот момент, когда пользователь пытается закрыть окно... Но я думаю, что асинхронный запрос на сохранение с отправкой и забылкой не будет проблемой.
Поэтому мой вопрос - как именно он будет себя вести ... как он будет продолжать работать в фоновом режиме?в то время как страница выгружается и в случае, когда она будет скрыта, в какой момент она будет вызываться?
Код Javascript, вызываемый из beforeunload
или unload
, обычно является последним фрагментом скрипта, который будет выполнятьсяВаша страница, прежде чем она будет закрыта.Вот почему, если вам нужен ответ от сервера, синхронный запрос является единственным вариантом (в противном случае ответ никогда не будет обработан).После завершения события страница уничтожается.Событие pagehide
аналогично, за исключением того, что страница не будет уничтожена, но вместо этого она будет сериализована и сохранена где-то, поэтому ее можно будет загрузить и возобновить позже.
Из этого следует, что вы не должны выполнять какую-либо логику «очистки», такую как уничтожение объектов и т. Д. В событии pagehide
.
Более подробную информацию можно найти в этомсообщение в блоге от команды WebKit, когда они создавали событие pagehide
: Кэш страницы WebKit II - событие выгрузки