Предотвращение кеширования на кнопке возврата в Safari 5 - PullRequest
23 голосов
/ 14 марта 2011

По состоянию на недавний выпуск Safari 5, и это, как оказалось, вызывает некоторые проблемы для моего сайта. У меня есть динамический веб-сайт, работающий под классическим ASP (хотя это не должно иметь большого значения), и у сайта есть некоторое творческое использование стека истории. Например, вы можете попасть на страницу со списком продуктов, а затем перейти к сведениям о продукте и изменить продукт (представление администратора). Когда вы нажимаете сохранить на продукте, информация отправляется на сервер через AJAX, и выдается history.back(). Это прекрасно работает во всех браузерах (включая safari <= 4), однако в недавно выпущенном safari 5 он перестал работать. Кажется, что когда вы возвращаетесь в Safari 5, он фактически не обновляет страницу, а только загружает ее из кэша, что означает, что изменения, внесенные в подробном представлении, не отображаются. Как я могу сделать это в Safari 5? Это текущий код, который я должен отключить кэширование (включен в верхней части каждой страницы): </p>

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()

Ответы [ 3 ]

46 голосов
/ 19 марта 2013

Пустой обработчик 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() 
    }
});
7 голосов
/ 15 марта 2011

После некоторого поиска и поиска я нашел решение, хотя я не слишком доволен этим. Установка onunload="" в теге body заставляет Safari сделать страницу недействительной и перезагрузить ее после window.history.back();.

3 голосов
/ 22 сентября 2011

Вот еще один способ:

    function invalidateBackCache() {
        // necessary for Safari: mobile & desktop
    }

    window.addEventListener("unload", invalidateBackCache, false);

Я решил пойти по этому пути, потому что добавление HTML (onunload = "") в тег body в .Net включало изменение трех файлов в моем случае. Установка атрибута onunload в jQuery также не помогла.

Это работает и для мобильного Sarfari (iPad).

...