Предотвращение кэширования на задней панели в Safari 5
По состоянию на недавнее сафари 5 было выпущено, и это, как оказалось, вызывает некоторые проблемы для моего сайта. У меня есть динамический веб-сайт с классическим ASP (хотя это не имеет большого значения), и на сайте есть творческое использование стека истории. Например, вы можете быть на странице, в которой перечислены продукты, а затем перейти к подробностям о продукте и изменить продукт (admin-view). Когда вы нажимаете "Сохранить" на продукте, информация отправляется на сервер через AJAX, и выдается history.back()
. Это отлично работает во всех браузерах (включая сафари <= 4), однако в недавно выпущенном сафари 5 он перестает работать. Кажется, что при нажатии на сафари 5 он фактически не обновляет страницу, он загружает ее только из кеша, а это значит, что изменения, сделанные в представлении деталей, не отображаются. Как я могу продолжить эту работу в сафари 5? Это текущий код, который я должен отключить кеширование (включено в начало каждой страницы):
Dim pStr
pStr = "private, no-cache, no-store, must-revalidate"
Response.AddHeader "pragma","no-cache" '?
Response.AddHeader "cache-control", pStr '? Er ikke sikker på om disse 3 siste er nødvendige.
Response.AddHeader "cache-control", "post-check=0, pre-check=0" '? Er ikke sikker på om disse 3 siste er nødvendige.
Response.AddHeader "Expires", "Mon, 26 Jul 1997 05:00:00 GMT" '?
Response.AddHeader "Last-Modified", Now()
Ответы
Ответ 1
Пустой обработчик unload
больше не будет работать. Вместо этого вы можете проверить свойство persisted
события onpageshow
. Он установлен на значение false при начальной загрузке страницы. Когда страница загружается из bfcache, она имеет значение true.
Решение Kludgish - это принудительное перезагрузку при загрузке страницы из bfcache.
window.onpageshow = function(event) {
if (event.persisted) {
window.location.reload()
}
};
Если вы используете jQuery, выполните следующие действия:
$(window).bind("pageshow", function(event) {
if (event.originalEvent.persisted) {
window.location.reload()
}
});
Ответ 2
После некоторых googeling и рытья я нашел решение, хотя я не слишком доволен этим. Установка onunload=""
в теге body вызывает Safari для отмены страницы и перезагрузки вверх window.history.back();
.
Ответ 3
Здесь другой способ:
function invalidateBackCache() {
// necessary for Safari: mobile & desktop
}
window.addEventListener("unload", invalidateBackCache, false);
Я выбрал этот маршрут, потому что добавление HTML (onunload = "") в тег body в .Net включало изменение трех файлов в моем случае. Установка атрибута onunload в jQuery также не решила его.
Это работает и для мобильного Sarfari (iPad).