Почему бы не использовать вместо этого только прослушиватель onLoad? Хотя он будет немного медленнее, он должен быть более надежным.
На самом деле, после небольшого осмотра, я не уверен, что модификация DOM имеет какой-либо смысл, если только обработчик onBeforeUnload
не вернет false
сначала - то есть заставит пользователя остаться на той же странице.
Насколько я понимаю, событие onBeforeUnload
запускается всего за до того, как страница выгружена, поэтому, если вы не вернете false
, браузер выгрузит страницу и DOM, и любой выполненный JavaScript после этого будет бессмысленно.
Это не совсем объясняет, почему JavaScript не выполняется должным образом в функции onBeforeUnload
, но из того, что я видел, сайты используют только диалоги window.alert
или window.prompt
для запроса пользователь, если он хочет покинуть сайт, а затем часто выполняет JavaScript, если пользователь решает остаться.
Следовательно, я предполагаю, что некоторые браузеры могут не разрешать манипулирование DOM при запуске этого события - поскольку если страница выгружена, любые манипуляции с DOM абсолютно бессмысленны.
Так что либо:
- Верните
false
в вашем методе onBeforeUnload
, а затем покажите ваш предварительный загрузчик (хотя это остановит переход к следующей странице)
- Используйте событие
onLoad
на следующей странице, чтобы вместо этого показать изображение предварительной загрузки
Также обратите внимание: версии Opera 9.5 и ниже не поддерживают это событие (я не уверен насчет более поздних версий), но GMail удается перехватить кнопку возврата в Opera.
Возможно, это это предупреждение безопасности для реализации события onBeforeUnload
в IE7 - возможно, Microsoft исправила его таким образом, чтобы предотвратить то, что вы пытаетесь сделать. И я знаю IE6 и ниже не разрешают такие команды, как document.location=''
в обработчике onBeforeUnload
по соображениям безопасности.