2012-01-09 5 views
50

У вас возникла проблема с загрузкой старых видеороликов youtube при нажатии кнопки «Назад». Я попытался добавить onunload = "" (упомянутый здесь Preventing cache on back-button in Safari 5) в тег body, но в этом случае он не работает.Запрет загрузки сафари из кеша при нажатии кнопки «назад»

Есть ли способ предотвратить загрузку сафари из кеша на определенной странице?

+0

возможного дубликата [Mobile Safari кнопки назад] (http://stackoverflow.com/questions/11979156/mobile-safari-back-button) –

+0

Ответ @MikaTuupola должен быть отмечен как правильный ответ. –

+0

Это смиренная проблема, которую я испытал из-за того же поведения BFCache в Safari: http://stackoverflow.com/questions/40727989/is-onbeforeunload-cached-on-safari-macos/40896361?noredirect=1#comment69043078_40896361 – juanmirocks

ответ

139

Ваша проблема вызвана back-forward cache. Предполагается сохранить полное состояние страницы, когда пользователь перемещается. Когда пользователь перемещается назад с помощью кнопки «Назад», вы можете быстро загрузиться из кеша. Это отличается от обычного кеша, который кэширует только HTML-код.

Когда страница загружается для bfcache onload Событие не запускается. Вместо этого вы можете проверить свойство 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() 
    } 
}); 
+4

Это единственное работающее решение, которое я нашел до сих пор, но он довольно несовершенен, так как страница до сих пор показывается ненадолго перед перезагрузкой, и решение легко сорвано, отключив javascript. Неужели кому-нибудь удалось найти более полное решение? – lukens

+0

Это, похоже, не работает на Chrome для Android (не тестируя какой-либо другой браузер для мобильных устройств, поэтому ограничиваю мое заявление) – Dominique

1

Вы можете использовать якорь и посмотреть значение местоположения документа href;

Начать с http://acme.co/, добавить что-то в местоположение, например '#b';

Итак, теперь ваш URL-адрес: http://acme.co/#b, когда человек обращается к кнопке «Назад», он возвращается к http://acme.co, а функция проверки интервалов видит отсутствие установленного хэш-тега, очищает интервал и загружает URL-адрес ссылки с прикрепленной к нему отметкой времени.

Есть некоторые побочные эффекты, но я оставлю вас, чтобы понять те из;)

<script> 
document.location.hash = "#b"; 
var referrer = document.referrer; 

// setup an interval to watch for the removal of the hash tag 
var hashcheck = setInterval(function(){ 
    if(document.location.hash!="#b") { 

    // clear the interval 
    clearInterval(hashCheck); 

    var ticks = new Date().getTime(); 
    // load the referring page with a timestamp at the end to avoid caching 
    document.location.href.replace(referrer+'?'+ticks); 
    } 
},100); 
</script> 

Это непроверенное, но он должен работать с минимальной настройкой.

+2

смешное, единственное * все еще * рабочее решение получает отрицательный рейтинг – daslicht

0

поведение связано с Назад/Вперед кэша браузера Safari. Вы можете узнать об этом на соответствующей компании Apple документации: http://web.archive.org/web/20070612072521/http://developer.apple.com/internet/safari/faq.html#anchor5

собственное затруднительное предложение от Apple, чтобы добавить пустой IFRAME на странице:

<iframe style="height:0px;width:0px;visibility:hidden" src="about:blank"> 
    this frame prevents back forward cache 
</iframe> 

(предыдущий общепринятый ответ, кажется, действует тоже, просто хотел скинуться в документации и другим потенциальным затруднительного)

+2

iframe hack did not работает для меня на safari/ios – commonpike

+0

Лучшее решение, которое я нашел здесь: http://stackoverflow.com/questions/20899274/how-to-refresh-page-on-back-button-click –

+1

В настоящий момент это не работает –

0

Прежде всего поля вставки в код:

<input id="reloadValue" type="hidden" name="reloadValue" value="" /> 

затем запустить JQuery:

jQuery(document).ready(function() 
{ 
     var d = new Date(); 
     d = d.getTime(); 
     if (jQuery('#reloadValue').val().length == 0) 
     { 
       jQuery('#reloadValue').val(d); 
       jQuery('body').show(); 
     } 
     else 
     { 
       jQuery('#reloadValue').val(''); 
       location.reload(); 
     } 
}); 
5

Да, браузер Safari не обрабатывает кеш кнопки назад/вперёд, как в Firefox, так и в Chrome. В частности, iframe, например, видео vimeo или youtube, кэшируется, хотя есть новый iframe.src.

Я нашел три способа справиться с этим. Выберите лучшее для своего дела. Solutions протестирован на Firefox 53 и Safari 10.1

1. Обнаружить, если пользователь использует кнопку возврата/ПРЕДИСЛОВИЕ, а затем перезагрузить всю страницу или перезагрузить только кэшированные плавающие фреймы, заменив СРК

if (!!window.performance && window.performance.navigation.type === 2) { 
      // value 2 means "The page was accessed by navigating into the history" 
      console.log('Reloading'); 
      //window.location.reload(); // reload whole page 
      $('iframe').attr('src', function (i, val) { return val; }); // reload only iframes 
     } 

2. перезагружать всю страницу, если страница кэшируется

window.onpageshow = function (event) { 
     if (event.persisted) { 
      window.location.reload(); 
     } 
    }; 

3. удалить страницу из истории, так что пользователи не могут v ISIT страница снова назад/вперед кнопки

$(function() { 
      //replace() does not keep the originating page in the session history, 
      document.location.replace("/Exercises#nocache"); // clear the last entry in the history and redirect to new url 
     }); 
3

Все те ответ немного о взломе. В современных браузерах (сафари) только на работе onpageshow раствора,

window.onpageshow = function (event) { 
    if (event.persisted) { 
     window.location.reload(); 
    } 
}; 

но на медленных устройствах иногда вы будете видеть на долю секунды предыдущего вида кэширования, прежде чем он будет перезагружен. Правильный способ справиться с этой проблемой, чтобы установить правильно Cache-Control на ответ сервера на один сильфоне

'Cache-Control', 'no-cache, max-age=0, must-revalidate, no-store'

Смежные вопросы