Я хочу отображать из кеша в течение длительного времени, и мне нужно немного другое поведение при рендеринге страницы по сравнению с загрузкой страницы из кеша. Есть ли простой способ определить это с помощью JavaScript?



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Один из способов сделать это - включить время создания страницы на странице, а затем использовать некоторый javascript для сравнения местного времени с временем создания страницы. Если время отличается на пороговое значение, значит, страница была получена из кеша. Проблема заключается в том, что время на клиентском компьютере установлено неправильно, хотя вы можете обойти это, заставив клиента включить свое текущее системное время в запрос на создание страницы, а затем отправить это значение обратно клиенту.
Я действительно думал об этом решении. Я надеялся, что в документе будет что-то попроще, но, возможно, этого не существует :)
Это не лучший ответ, если вы хотите, чтобы он работал стабильно. Между медленным временем загрузки, местным временем сервера и местным временем клиента или клиентами с неверными системными датами у вас нет возможности гарантировать достоверность этого теста.
Не напрямую, в некоторых браузерах для этого могут быть какие-то специальные команды.
Есть обходной путь, который сделает то, что вы хотите. Используйте cookie для хранения timestamp первого посещения, а затем используйте META HTTP-EQUIV, чтобы установить продолжительность кэширования файла (cacheLength). Если текущее время находится в пределах временного периода от timestamp до timestamp+cacheLength, то считайте, что они загружены из кеша. По истечении срока действия кеша сбросьте время cookie.
Используя XmlHttpRequest, вы можете открыть текущую страницу, а затем изучить http-заголовки ответа.
В лучшем случае просто выполните запрос HEAD, а затем изучите заголовки.
Некоторые примеры этого можно найти в http://www.jibbering.com/2002/4/httprequest.html.
Я собирался предложить то же самое, но вопрос указывает на то, что он хочет увидеть, кэшируется ли текущая загруженная страница, и если вы отключите XHR, это будет свидетельствовать о следующем запросе, а не о текущем.
Спасибо, я не могу использовать это, но ссылка, которую вы мне прислали, помогает мне решить другую проблему.
Я начал с ответа, который «Дэниел» дал выше, но боюсь, что из-за медленного соединения я могу столкнуться с некоторыми проблемами с задержкой.
Вот решение, которое в конечном итоге сработало для меня. На стороне сервера я добавляю cookie refCount и устанавливаю для него значение 0. При загрузке документа в javascript я сначала проверяю refCount, а затем увеличиваю его. Проверяя, больше ли refCount 1, я знаю, что страница кэшируется. Так что для этого работает шарм.
Спасибо, ребята, что привели меня к этому решению.
Я сам использовал такой же подход. Подробное описание написал в своем блоге: monket.net/blog/2010/02/…
Спас мой день! Однако я не понял, зачем увеличивать cookie. Просто установите его на «firstLoad = yes» и измените на «firstLoad = no» в onLoad. По сути, cookie - это просто логический флаг, который хранится постоянно, пока страница не будет перезагружена.
Пока этому вопросу уже 4 года. Я думал, что добавлю свои 2 цента с помощью jQuery и плагина История.
$(document).ready(function()
{
$('body').append('<div class = "is_cached"></div>');
});
History.Adapter.bind(window,'statechange',function(){
if ($('.is_cached').length >= 1)
{
alert('this page is cached');
}
});
Когда документ загружается впервые. Добавляется новый div.is_cached. Нет совместимого способа выполнить javascript при загрузке кэшированной страницы, но вы можете отслеживать изменения истории. Когда история изменяется и div.is_cached существует, пользователь просматривает кешированную страницу.
какие файлы javascript мне следует использовать для проверки? Я скачал плагин History, но в нем много JS-файлов ... какой из них с ним работает?
Я без проблем использовал его с jQuery. github.com/balupton/history.js/blob/master/scripts/bundled/…
Примечание: оператор IF должен быть> = 1
Я пробовал, но ничего не происходит, я связал историю js и последнюю версию jqeury js ... Пожалуйста, проверьте - slgag.com/cd.html
Вам не хватает типа скрипта для вашего тега <script>.
Хорошо, я изменил его, но у меня все еще не работает ...? что не так с моим кодом?
Вы уверены, что это не работает? Это проверяет, исходит ли отображаемая страница из кеша браузера. У вас должна быть ссылка на странице, чтобы переместить пользователя вперед, а затем вы можете нажать кнопку «Назад», чтобы увидеть отображение предупреждения.
"Нет совместимого способа выполнить javascript при загрузке кешированной страницы" подождите ... мои сценарии выполняются нормально, даже когда страница загружается из кеша
С новой спецификацией Resource Timing Level 2 вы можете использовать свойство размера передачи, чтобы проверить, загружена ли страница из кеша:
var isCached = performance.getEntriesByType("navigation")[0].transferSize === 0;
В моем случае для firefox 74 win10 условие должно быть pnt.transferSize === 0 && pnt.type === 'back_forward', иначе вечная перезагрузка.
window.rand = {{ rand() }}
reloadIfCached() {
var cached = localStorage.getItem(window.location.href) == window.rand;
if (cached) {
window.location.reload();
}
localStorage.setItem(window.location.href, window.rand);
}
блин, ты меня опередил, палец вверх!