Перезагрузите сайт, когда он достигнут через кнопку браузера Назад
Проблема: у меня есть сайт с динамическим контентом, который нужно перезагружать каждый раз, когда пользователь видит его. Это включает случай использования, когда пользователь нажимает кнопку "Назад" на другом сайте и приходит на сайт, необходимый для перезагрузки. Большинство (всех?) Браузеров не обновляют сайт после этого события.
Мое решение (которое не совсем работает):
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.
}
Но он еще не обновляет страницу.
Любые идеи, которые могут повлиять на/заблокировать желаемое поведение? Соответственно, любые другие решения для этой проблемы?
изменить:
Установить следующее:
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" />
до сих пор нет успеха.
Ответы
Ответ 1
Вы должны использовать скрытый 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');
});
Когда вы нажимаете кнопку "Назад", значения в скрытых полях сохраняют то же значение, что и при первоначальном выходе из страницы.
Итак, при первом загрузке страницы входное значение будет "no". Когда вы вернетесь на страницу, это будет "да", и ваш код JavaScript вызовет обновление.
Ответ 2
После тестирования различных решений я обнаружил, что JavaScript Timing API работает лучше всего для обнаружения взаимодействий с кнопкой "Назад".
Все, что вам нужно сделать, это следующее:
if(!!window.performance && window.performance.navigation.type == 2)
{
window.location.reload();
}
И он хорошо работает со всеми основными браузерами: http://caniuse.com/#search=Navigation%20Timing%20API
Загружается ли моя страница из кэша браузера?
Ответ 3
это работало для меня, в 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>';
}
?>
кто-то отправил здесь: спасибо, надеюсь, он тоже вам поможет.
Ответ 4
Попробуйте следующее:
header("Cache-Control: no-store, must-revalidate, max-age=0");
header("Pragma: no-cache");
header("Expires: Sat, 26 Jul 1997 05:00:00 GMT");
//Дата в прошлом
Ответ 5
Помогает ли это?
Обновить страницу при нажатии кнопки
Или с метатегами,
<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 -->
Не уверен, что мета поможет, но вы можете проверить его.
Ответ 6
Я думаю, вам нужно точно перезагрузить - window.location.reload()
. Но главная проблема - кросс-браузерное простое решение. Код на PHP:
$inline_javascript = 'var uniqueString = ' . time() . ';' .
'if (uniqueString === window.name) {' .
' window.location.relace();' .
'} else {' .
' window.name = uniqueString;' .
'}';
И напечатайте его перед css и js файлами в.
Ответ 7
Я нашел решение: добавьте no-store
в заголовок Cache-Control
. Я сделал это в заголовках http, но, я думаю, он мог бы работать и с метатегами. Протестировано в Chromium и Firefox.
См. также Как остановить хром от кеширования
Ответ 8
Вы можете использовать этот код в настраиваемом модуле:
<?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');
}
?>
Ответ 9
Я думаю, этот вопрос поможет вам.
[edit (Nickolay): вот почему он работает именно так: webkit.org, developer.mozilla.org. Прочтите эти статьи (или мое резюме в отдельный ответ ниже) и подумайте, действительно ли вам нужно это делать и сделать вашу страницу медленнее для ваших пользователей.]
Ответ Nickolay