Перезагрузите сайт при достижении через браузер кнопку назад - PullRequest
20 голосов
/ 28 января 2012

Проблема: у меня есть сайт с динамическим контентом, который нужно перезагружать каждый раз, когда пользователь видит его.Это включает в себя случай использования, когда пользователь нажимает кнопку «Назад» на другом сайте и заходит на сайт, который необходимо перезагрузить.Большинство (всех?) Браузеров не обновляют сайт после этого события.

Мое решение (которое не совсем работает): http://www.hunlock.com/blogs/Mastering_The_Back_Button_With_Javascript

window.onbeforeunload = function () {
    // This function does nothing.  It won't spawn a confirmation dialog
    // But it will ensure that the page is not cached by the browser.
}

Но оно все еще не 't обновить страницу.

Есть идеи, что может повлиять / заблокировать желаемое поведение?Соответственно какие-либо другие решения для решения этой проблемы?

edit:

Установить следующее:

Cache-Control   private, must-revalidate, max-age=0
Expires Sat, 26 Jul 1997 05:00:00 GMT
Pragma  no-cache

и:

<meta name="cache-control" content="no-cache" />
<meta name="expires" content="0" />
<meta name="pragma" content="no-cache" />

все еще не удалось

Ответы [ 10 ]

56 голосов
/ 05 октября 2013

Вы должны использовать скрытый input в качестве индикатора обновления со значением «нет»:

<input type="hidden" id="refresh" value="no">

Теперь, используя jQuery, вы можете проверить его значение:

$(document).ready(function(e) {
    var $input = $('#refresh');

    $input.val() == 'yes' ? location.reload(true) : $input.val('yes');
});

Когда вы нажимаете кнопку «Назад», значения в скрытых полях сохраняют то же значение, что и при первоначальном выходе из страницы.

Таким образом, при первой загрузке страницы значением ввода будет «нет».,Когда вы вернетесь на страницу, будет «да», и ваш код JavaScript вызовет обновление.

16 голосов
/ 10 февраля 2017

После тестирования различных решений я обнаружил, что API-интерфейс синхронизации навигации по JavaScript лучше всего подходит для обнаружения взаимодействий с кнопкой возврата.

Все, что вам нужно сделать, это:

if(!!window.performance && window.performance.navigation.type == 2)
{
    window.location.reload();
}

И это хорошо работает со всеми основными браузерами: http://caniuse.com/#search=Navigation%20Timing%20API

Загружается ли моя страница из кэша браузера?

2 голосов
/ 06 февраля 2018

Вы можете использовать событие window.onpageshow, чтобы проверить, поступает ли страница из кэша.

window.onpageshow = function (event) {
  if (event.persisted) {
    window.location.reload(); //reload page if it has been loaded from cache
  }
};

Обратите внимание, что для этого требуются более современные браузеры, чем некоторые из предыдущих ответов (например, IE11 +).Для получения дополнительной информации о поддержке браузера см. здесь

1 голос
/ 20 февраля 2013

это сработало для меня, в drupal 7 (php) каждый раз, когда пользователь выходит из системы, он может нажать кнопку «Назад» и иметь возможность посещать привилегированные страницы.Если страница обновляется, то он перенаправляется на первую страницу, где он ничего не может сделать.

    <?php 
        //refresh the page after log-out and back button
        if (!user_is_logged_in())
        {

          print '<input type="hidden" id="refreshed" value="no">
                 <script type="text/javascript">
                  onload=function(){

                    var e=document.getElementById("refreshed");
                    if(e.value=="no")e.value="yes";
                    else{e.value="no";location.reload();}
                  }
                </script>';
        }
  ?>

кто-то опубликовал здесь : спасибо, надеюсь, это вам тоже поможет.

0 голосов
/ 31 июля 2015

Вы можете использовать этот код в пользовательском модуле:

<?php 
/**
 * Implements hook_init().
 */
function MY_MODULE_init() {
  drupal_add_http_header('Cache-Control', 'no-cache, no-store, max-age=0, must-revalidate, post-check=0, pre-check=0');
}
?>
0 голосов
/ 19 июня 2015

Попробуйте это:

header("Cache-Control: no-store, must-revalidate, max-age=0");
header("Pragma: no-cache");
header("Expires: Sat, 26 Jul 1997 05:00:00 GMT");

// Дата в прошлом

0 голосов
/ 28 ноября 2013

Я нашел решение: добавьте no-store в заголовок Cache-Control. Я сделал это в заголовках http, но я думаю, что это может работать и с метатегами. Протестировано в Chromium и Firefox.

См. Также Как остановить кэширование хрома

0 голосов
/ 19 января 2013

Я думаю, что вам нужна именно перезагрузка - window.location.reload(). Но главная проблема заключается в простом решении кросс-браузер. Код на PHP:

$inline_javascript = 'var uniqueString = ' . time() . ';' .
                     'if (uniqueString === window.name) {' .
                     '  window.location.relace();' .
                     '} else {' .
                     '  window.name = uniqueString;' .
                     '}';

И распечатайте его перед файлами css и js в.

0 голосов
/ 28 января 2012

Я думаю этот вопрос поможет вам.

[edit (Николай): вот почему это работает так: webkit.org, developer.mozilla.org.Пожалуйста, прочитайте эти статьи (или мое резюме в отдельном ответе ниже) и подумайте, действительно ли вам нужно сделать это, чтобы ваша страница загружалась медленнее для ваших пользователей.]

ответ Николая

0 голосов
/ 28 января 2012

Помогает ли?

Перезагрузить страницу при нажатии кнопки назад

Или с метатегами,

<meta http-equiv="cache-control" content="no-cache"> <!-- tells browser not to cache -->
<meta http-equiv="expires" content="0"> <!-- says that the cache expires 'now' -->
<meta http-equiv="pragma" content="no-cache"> <!-- says not to use cached stuff, if there is any -->

Не уверен, мета поможет, но вы можете проверить его.

...