問題:動的コンテンツを含むサイトがあり、ユーザーが表示するたびにリロードする必要があります。これには、ユーザーが別のサイトの戻るボタンを押して、リロードが必要なサイトにアクセスするユースケースが含まれます。ほとんどの(すべて?)ブラウザーは、このイベントの後にサイトを更新しません。
私の解決策(まったく機能していません): http://www.hunlock.com/blogs/Mastering_The_Back_Button_With_Javascript
window.onbeforeunload = function () {
// This function does nothing. It won't spawn a confirmation dialog
// But it will ensure that the page is not cached by the browser.
}
しかし、それでもページは更新されません。
希望する動作に影響を与える/ブロックできるアイデアはありますか?この問題に対する他の解決策の提案はそれぞれありますか?
編集:
以下を設定します。
Cache-Control private, must-revalidate, max-age=0
Expires Sat, 26 Jul 1997 05:00:00 GMT
Pragma no-cache
そして:
<meta name="cache-control" content="no-cache" />
<meta name="expires" content="0" />
<meta name="pragma" content="no-cache" />
まだ成功していません。
「no」の値で、非表示のinput
を更新インジケーターとして使用する必要があります。
<input type="hidden" id="refresh" value="no">
JQueryを使用して、その値を確認できます。
$(document).ready(function(e) {
var $input = $('#refresh');
$input.val() == 'yes' ? location.reload(true) : $input.val('yes');
});
戻るボタンをクリックすると、非表示フィールドの値は、最初にページを離れたときと同じ値を保持します。
したがって、初めてページをロードするとき、入力の値は「no」になります。ページに戻ると「yes」になり、JavaScriptコードが更新をトリガーします。
さまざまなソリューションを試した後、JavaScriptナビゲーションタイミングAPIが戻るボタンとの相互作用を検出するのに最適であることがわかりました。
あなたがしなければならないのはこれだけです:
if(!!window.performance && window.performance.navigation.type == 2)
{
window.location.reload();
}
そして、それはすべての主要なブラウザでうまく機能します: http://caniuse.com/#search=Navigation%20Timing%20API
window.onpageshow
イベントを使用して、ページがキャッシュから来ているかどうかをテストできます。
window.onpageshow = function (event) {
if (event.persisted) {
window.location.reload(); //reload page if it has been loaded from cache
}
};
これには、以前の回答(IE11 +など)よりも最新のブラウザーが必要であることに注意してください。ブラウザのサポートの詳細については、 here を参照してください
これは私のために、drupal 7(php)で、ユーザーがログアウトするたびに、戻るボタンを押して特権ページにアクセスできます。ページが更新されると、彼はルーティングされます。彼は何もできないフロントページへ。
<?php
//refresh the page after log-out and back button
if (!user_is_logged_in())
{
print '<input type="hidden" id="refreshed" value="no">
<script type="text/javascript">
onload=function(){
var e=document.getElementById("refreshed");
if(e.value=="no")e.value="yes";
else{e.value="no";location.reload();}
}
</script>';
}
?>
誰かが投稿しました こちら :ありがとう。
それは役立ちますか?
または、メタタグを使用して、
<meta http-equiv="cache-control" content="no-cache"> <!-- tells browser not to cache -->
<meta http-equiv="expires" content="0"> <!-- says that the cache expires 'now' -->
<meta http-equiv="pragma" content="no-cache"> <!-- says not to use cached stuff, if there is any -->
確かではありませんが、メタが役立ちますが、テストできます。
カスタムモジュールでこのコードを使用できます。
<?php
/**
* Implements hook_init().
*/
function MY_MODULE_init() {
drupal_add_http_header('Cache-Control', 'no-cache, no-store, max-age=0, must-revalidate, post-check=0, pre-check=0');
}
?>
解決策を見つけました:no-store
をCache-Control
ヘッダーに追加します。私はhttpヘッダーでそれをしましたが、メタタグでも動作すると思います。 ChromiumとFirefoxでテスト済み。
これを試して :
header("Cache-Control: no-store, must-revalidate, max-age=0");
header("Pragma: no-cache");
header("Expires: Sat, 26 Jul 1997 05:00:00 GMT");
//過去の日付