После перехода в историю 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>

Ответ 1

Установить пустую функцию, которая будет вызываться в 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 (архивная версия)

Ответ 2

Когда я использую кнопку "Назад" в Firefox для доступа к ранее посещенной странице, сценарии на этой странице не будут запускаться снова.

Это правильно и хорошо.

Когда вы нажимаете ссылку в Firefox (и Safari и Opera), она не сразу уничтожает вашу страницу, чтобы перейти на следующую. Он держит страницу неповрежденной, просто скрывая ее от просмотра. Если вы нажмете кнопку "Назад", она снова вернет старую страницу, не загружая документ еще раз; это намного быстрее, что приводит к более плавным переходам назад/вперед страницы для пользователя.

Эта функция называется bfcache.

Любой контент, который вы добавили на страницу во время загрузки пользователя, и его использование все равно будут присутствовать. Любые обработчики событий, которые вы прикрепляли к элементам страницы, по-прежнему будут прикреплены. Любые тайм-ауты/интервалы, которые вы установили, будут по-прежнему активны. Поэтому редко есть причина, по которой вам нужно знать, что вы были скрыты и повторно показаны. Было бы неправильным вызывать код onload или inline script еще раз, потому что любое создание привязки и контента, которое вы сделали в этой функции, будет выполняться во второй раз над одним и тем же контентом с потенциально катастрофическими результатами. (например, document.write в inline script полностью уничтожит страницу.)

Причиной написания статьи window.onunload является то, что браузеры, которые реализуют bfcache, решили, что для совместимости со страницами, которые действительно нужно знать, когда их отбрасывают, - любая страница, которая заявляет о заинтересованности в понимании того, когда onunload произойдет, чтобы bfcache был отключен. Эта страница будет загружена свежей, когда вы вернетесь к ней, вместо того, чтобы извлекать ее из bfcache.

Итак, если вы установите window.onunload= function() {};, то, что вы на самом деле делаете, намеренно ломает bfcache. Это приведет к тому, что ваши страницы будут медленно перемещаться и не должны использоваться, кроме как в крайнем случае.

Если вам нужно знать, когда пользователь уходит или возвращается на вашу страницу, не испорчая bfcache, вы можете заблокировать события onpageshow и onpagehide:

window.onload=window.onpageshow= function() {
    alert('Hello!');
};

Ответ 3

Вы можете проверить свойство 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");
    }
});

Ответ 4

Провод в событии 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>

Ответ 5

Насколько я знаю, Firefox не запускает событие onLoad на обратной стороне.

Он должен инициировать onFocus вместо этого из этой ссылки здесь.

Ответ 6

Простым способом заставить страницу выполнять JavaScript, когда пользователь переходит к ней с использованием истории браузера, является событие OnPopState. Мы используем это для приостановки и воспроизведения видео на нашей домашней странице (https://fynydd.com).

window.onpopstate = function() {

    // Do stuff here...
};

Ответ 7

для некоторых случаев, таких как ajax-операции, можно использовать прослушиватель изменений URL

$(window).on('hashchange', function() {
        ....
});