После возвращения в историю Firefox JavaScript не будет работать
Когда я использую кнопку "Назад" в Firefox, чтобы перейти на ранее посещенную страницу, сценарии на этой странице больше не запускаются.
Существуют ли какие- либо исправления / обходные пути для повторного выполнения скриптов при повторном просмотре страницы?
Обратите внимание, что я протестировал те же страницы в Google Chrome и Internet Explorer, и они работают как задумано.
Вот файлы и шаги, которые я использовал для проверки проблемы:
(перейдите к 0.html, нажмите, чтобы перейти к 1.html, нажмите кнопку назад)
0.html
<html><body>
<script>
window.onload = function() { alert('window.onload alert'); };
alert('inline alert');
</script>
<a href="1.html">Click Me!</a>
</body></html>
1.html
<html><body>
<p>Go BACK!</p>
</body></html>
8 ответов
Установите пустую функцию для вызова в window.onunload:
window.onunload = function(){};
например
<html><body>
<script type="text/javascript">
window.onload = function() { alert('window.onload alert'); };
window.onunload = function(){};
alert('inline alert');
</script>
<a href="1.html">Click Me!</a>
</body></html>
Источник: http://www.firefoxanswer.com/firefox/672-firefoxanswer.html (Архивная версия)
Когда я использую кнопку "Назад" в Firefox, чтобы перейти на ранее посещенную страницу, сценарии на этой странице больше не запускаются.
Это правильно и это хорошо.
Когда вы нажимаете на ссылку в Firefox (и в Safari, и в Opera), она не сразу уничтожает вашу страницу, чтобы перейти на следующую. Он сохраняет страницу нетронутой, просто скрывая ее от просмотра. Если вы нажмете кнопку "Назад", она вернет старую страницу к просмотру, без необходимости снова загружать документ; это намного быстрее, что приводит к более плавному переходу страниц назад / вперед для пользователя.
Эта функция называется bfcache.
Любой контент, который вы добавили на страницу во время предыдущей загрузки пользователя и его использования, все равно будет там. Любые обработчики событий, которые вы прикрепили к элементам страницы, все равно будут присоединены. Любые установленные вами тайм-ауты / интервалы все равно будут активны. Так что редко есть какая-то причина, по которой вам нужно знать, что вас спрятали и снова показали. Было бы неправильно звонить onload
или снова встроенный код сценария, потому что любое связывание и генерация контента, которые вы выполняли в этой функции, выполнялись бы второй раз над одним и тем же контентом с потенциально катастрофическими результатами. (например. document.write
встроенный скрипт полностью уничтожил бы страницу.)
Причина написания window.onunload
В результате браузеры, реализующие bfcache, решили, что - для совместимости со страницами, которые действительно должны знать, когда их отбрасывают, - любая страница, которая заявляет о своем интересе знать, когда onunload
произойдет приведет к отключению bfcache. Эта страница будет загружена заново, когда вы вернетесь к ней, а не будет извлечена из bfcache.
Так что если вы установите window.onunload= function() {};
то, что вы на самом деле делаете, это намеренно ломает bfcache. Это приведет к медленной навигации по вашим страницам, и их не следует использовать, кроме как в крайнем случае.
Если вам нужно знать, когда пользователь покидает или возвращается на вашу страницу, не испортив bfcache, вы можете перехватить onpageshow
а также onpagehide
события вместо:
window.onload=window.onpageshow= function() {
alert('Hello!');
};
Вы можете проверить persisted
собственность pageshow
событие. При начальной загрузке страницы устанавливается значение false. Когда страница загружается из кэша, она имеет значение true.
window.onpageshow = function(event) {
if (event.persisted) {
alert("From bfcache");
}
};
По какой-то причине jQuery не имеет этого свойства в событии. Вы можете найти его из оригинального события, хотя.
$(window).bind("pageshow", function(event) {
if (event.originalEvent.persisted) {
alert("From bfcache");
}
});
В моем случае
window.onunload
с пустой функцией не помогло (я пытался установить значение для раскрывающегося списка, когда пользователь использует кнопку «назад»). И
window.onload
не сработало по другой причине - было отменено
<body onload="...">
.
Итак, я попробовал это с помощью jQuery, и это сработало как шарм:
$(window).on('pageshow', function() { alert("I'm happy"); });
Простым способом заставить страницу исполнять JavaScript, когда пользователь возвращается к ней с использованием истории браузера, является событие OnPopState. Мы используем это для приостановки и воспроизведения видео на нашей домашней странице ( https://fynydd.com/).
window.onpopstate = function() {
// Do stuff here...
};
Подключите событие onunload, которое ничего не делает:
<html><body>
<script type="text/javascript">
window.onload = function() { alert('window.onload alert'); };
window.onunload = function(){};
alert('inline alert');
</script>
<a href="1.html">Click Me!</a>
</body></html>
Насколько я знаю, Firefox не работает onLoad
Событие на спине.
Это должно вызвать onFocus вместо этого на основе этой ссылки здесь.
Для некоторых случаев, таких как AJAX-операции, можно использовать обработчик URL-адресов.
$(window).on('hashchange', function() {
....
});