После путешествия в историю Firefox JavaScript не будет работать - PullRequest
74 голосов
/ 14 апреля 2010

Когда я использую кнопку «Назад» в 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>

Ответы [ 7 ]

85 голосов
/ 14 апреля 2010

Установить пустую функцию для вызова в 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>

* Источник: 1010 * http://www.firefoxanswer.com/firefox/672-firefoxanswer.html (Архивная версия)

67 голосов
/ 14 апреля 2010

Когда я использую кнопку «Назад» в 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!');
};
19 голосов
/ 29 сентября 2012

Вы можете проверить свойство 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");
    }
});
1 голос
/ 09 февраля 2016

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

window.onpopstate = function() {

    // Do stuff here...
};
1 голос
/ 14 апреля 2010

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

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

1 голос
/ 14 апреля 2010

Провод в событии 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>
0 голосов
/ 26 ноября 2015

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

$(window).on('hashchange', function() {
        ....
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...