Заставить перезагружать страницу в Chrome с помощью Javascript [без кеша]
Мне нужно перезагрузить страницу с помощью JavaScript и убедиться, что она не извлекается из кеша браузера, а вместо этого перезагружает страницу с сервера.
[Как элементы страницы будут изменяться промежуточный]
В IE и FF я обнаружил, что следующий код работал нормально:
window.location.reload(true);
Однако он не работает в Chrome или Safari.
Я попробовал следующее, но также безрезультатно;
window.location.replace(location.href);
document.location.reload(true);
document.location.replace(location.href);
Есть ли решение этой проблемы?
Выводы
Изучив это, я обнаружил, что эта проблема связана с обработкой протокола HTTP,
- Chrome отправляет запрос с полем
Pragma: no-cache
HTTP
- Сервер отвечает полем
Last-Modified: DATE1
- JS использует
location.reload(true)
для принудительной перезагрузки с сервера, не кэширующего
- Chrome отправляет запрос с полем
If-Modified-Since: DATE1
- Сервер отвечает
HTTP Status 304 Not Modified
Серверное приложение ошибочно не замечает изменения состояния в содержимом динамической страницы и, таким образом, не возвращает 200
.
Тем не менее, Chrome/WebKit является единственным браузером, который отправляет поле If-Modified-Since
при вызове JS location.reload(true)
.
Я думал, что буду делать выводы в этом случае, если кто-то другой столкнется с одной и той же проблемой.
Ответы
Ответ 1
Вы можете использовать этот хак:
$.ajax({
url: window.location.href,
headers: {
"Pragma": "no-cache",
"Expires": -1,
"Cache-Control": "no-cache"
}
}).done(function () {
window.location.reload(true);
});
Ответ 2
Чтобы страница не загружалась из кеша, вы можете добавить к номеру уникальный номер:
window.location = location.href + '?upd=' + 123456;
Вы также можете использовать дату вместо 123456
Ответ 3
Попробуйте window.location = window.location
Ответ 4
Отличные результаты! Я просто столкнулся с той же проблемой, и это действительно помогает!
Однако, помимо вашего нахождения, кажется, что Chrome всегда отправляет запрос GET для location.reload()... IE/FF вместо этого повторяет последний запрос.
Ответ 5
Это то, что я делаю, чтобы файл приложения был перезагружен на хроме:
var oAjax = new XMLHttpRequest;
oAjax.open( 'get', '/path/to/my/app.js' );
oAjax.setRequestHeader( 'Pragma', 'no-cache' );
oAjax.send();
oAjax.onreadystatechange = function() {
if( oAjax.readyState === 4 ) {
self.location.reload();
}
}