После возвращения в историю 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>

7 ответов


установите пустую функцию для вызова в 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");
    }
});

провод в событии" 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 вместо этого на основе этой ссылки здесь.


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

window.onpopstate = function() {

    // Do stuff here...
};

для некоторых случаев, таких как ajax operations url change listener можно использовать

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