После возвращения в историю 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() {
        ....
});
Другие вопросы по тегам