2012-01-09 25 views
50

戻るボタンをクリックしたときに古いYouTube動画をロードするサファリに問題が発生しました。 bodyタグにonunload = ""(ここではPreventing cache on back-button in Safari 5)を追加しようとしましたが、この場合は動作しません。戻るボタンをクリックしたときにキャッシュからのサファリロードを防止する

特定のページでキャッシュからのサファリロードを防止する手段はありますか?

+0

可能重複怒鳴る1に対するサーバの応答(http://stackoverflow.com/questions/11979156上で適切のCache-Controlを設定することです/ mobile-safari-back-button) –

+0

@MikaTuupola答えは正解とマークする必要があります。 –

+0

これはSafariでの同じBFCache動作のために私が経験した謙虚な問題です:http://stackoverflow.com/questions/40727989/is-onbeforeunload-cached-on-safari-macos/40896361?noredirect=1#comment69043078_40896361 – juanmirocks

答えて

139

back-forward cacheによって問題が発生しています。ユーザーが移動したときにページの完全な状態を保存することになっています。ユーザーが戻るボタンでページをナビゲートすると、キャッシュから非常に迅速にページをロードできます。これは、HTMLコードのみをキャッシュする通常のキャッシュとは異なります。

bfcacheのページがロードされたときに、onloadイベントが発生することはありません。代わりにonpageshowイベントのpersistedプロパティを確認できます。初期ページの読み込み時に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

これはAndroid用Chromeでは動作しないようです(私の声明を制限する他のモバイルブラウザはテストしていません) – 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の戻る/進むのキャッシュに関連しています。あなたは、関連するアップルのドキュメントでそれについて学ぶことができます: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ハックは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.srcがあるにもかかわらず、vimeoやyoutubeビデオのようなiframeはほとんどキャッシュされません。

これを処理する方法が3つ見つかりました。あなたのケースに最適なものを選んでください。Firefoxの53とSafari 10.1

1.上でテスト ソリューションユーザーがバック/ forewardボタンを使用している場合は、その後、検出ページ全体をリロードするか、SRC

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 
     } 

を交換することによってのみ、キャッシュされたのiframeをリロードページは、ユーザーがVすることはできませんので、履歴からページを削除

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

3.をキャッシュされている場合2.ページ全体をリロードそれらの答えのすべての戻る/進むボタン

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

によって再びページISITはハックのビットです。それが再ロードされる前にのみonpageshowソリューションの仕事、

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

が、遅いデバイス上での最近のブラウザ(Safariなど)では、時にはあなたは、スプリット秒前のキャッシュされたビューに表示されます。この問題に対処する適切な方法は、[モバイルSafariのバックボタン]の

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