bfcache相関
29898 ワード
前言
1つのケースを見てみましょう.1つのリストページでは、ページがロードされるたびにonload()イベントがajax方式で最新のリスト資料を再取得すると予想されています.そのため、クリックしてページに戻ると、ユーザーはすぐに最新のリスト資料を見ることができるはずです.その後、一部のブラウザでは、前のページに戻ると更新後の資料が自動的にロードされないことがわかり、再ロードするにはリフレッシュが必要です.これは、一部のブラウザでは、後退時にonloadイベントがトリガーされないためです.これはHTML 5世代ブラウザの新しい特性の一つであるBack-Forward Cache(bfcacheと略称)です.
bfcacheとは
私たちがよく知っている赤い本「JavaScript高級プログラム設計」にはbfcacheが言及されています.
bfcache、すなわちback-forward cacheは、「往復キャッシュ」と呼ばれ、ブラウザの「後退」ボタンと「前進」ボタンを使用すると、ページの変換速度を速めることができます.このキャッシュはページデータだけでなくDOMやJSの状態も保存しており,実際にはページ全体をメモリに保存している.ページがbfcacheにある場合、再びページを開くとonloadイベントはトリガーされません.
Pageshowイベント
このイベントは、bfcacheからのページかどうかにかかわらず、ページ表示時にトリガーされます.再ロードされたページでは、pageshowはloadイベントがトリガーされた後にトリガーされます.bfcacheのページではpageshowがページ状態が完全に回復した瞬間にトリガーされます.
pagehideイベント
このイベントは、ブラウザがページをアンインストールしたときにトリガーされ、unloadイベントの前にトリガーされます.
persistedプロパティ
pageshowイベントとpagehideイベントのeventオブジェクトにはpersistedというブール値属性も含まれています. pageshowイベントの場合、ページがbfcacheからロードされている場合、この属性の値はtrueである.そうでなければ、この属性の値はfalseです. pagehideイベントの場合、ページがアンインストールされた後にbfcacheに保存された場合、この属性の値はtrueである.そうでなければ、この属性の値はfalseです.
ブラウザによっては、現在のウィンドウの「開く」履歴の前のページの表現が統一されず、ブラウザの実装やページ自体の設定に関係します.
テスト
テストコード
ラインの例
テスト結果
browser
result
IE 11
新しい読み込みはloadとpageshowイベントをトリガーし、赤は保持されず、bfcacheはありません.
Chrome 52.0.2743.116
新しい読み込みはloadとpageshowイベントをトリガーし、赤は保持されず、bfcacheはありません.
Opera 39.0
新しい読み込みはloadとpageshowイベントをトリガーし、赤は保持されず、bfcacheはありません.
Firefox 48.0.2
新しくロードするとloadとpageshowイベントがトリガーされ、ポイントが大新浪に向かうとpagehideイベントがトリガーされますが、bfcacheには保存されません.赤は保持されていません.
Safari(iPhone) iOS 9.3.5
新しくロードするとloadとpageshowイベントがトリガーされ、点が大新浪に向かうとpagehideイベントがトリガーされ、bfcacheに格納され、赤色が保持されます.
UC
新しくロードするとloadとpageshowイベントがトリガーされ、点が大新浪に向かうとpagehideイベントがトリガーされ、bfcacheに格納され、赤色が保持されます.
qqブラウザ
新しくロードするとloadとpageshowイベントがトリガーされ、ポイントが大新浪に向かうとpagehideイベントがトリガーされ、bfcacheが格納されていないことを示しますが、赤は保持され、bfcacheはありますがpagehideイベントをサポートしていないpersistedプロパティ(疑い)
browser
新しい読み込みはloadとpageshowイベントをトリガーし、前のページに戻るとイベントはトリガーされず赤が保持され、bfcache(疑い)があります.
Safari、Firefox、UC、qqブラウザ、browserにbfcacheがあることがわかります.前ページに戻ると、 Safari、UC、qqブラウザはloadをトリガーしません. IE、Firefox、Chrome、Operaはpageshowイベントをサポートしますが、loadがトリガーされます. browserはイベントをトリガーしません.
ソリューション
Firefoxの開発者ドキュメントには、次のようなアイデアが用意されています.ページはunloadまたはbeforeunloadイベントをリスニングした. ページには「cache-control:no-store」が設定. Webサイトは、HTTPSを使用してページが少なくとも次の条件で満たされている場合に使用します. “Cache-Control: no-cache” “Pragma: no-cache” 要求ヘッダ「Expires:0」または「Expires」の値が「Date」の前の値を設定します(「Cache-Control:max-age=」も設定されていない限り).
ページは、ユーザが後退したときに完全にロードされていないか、XMLHttpRequestなどのネットワーク要求がある. ページはIndexedDB操作中です. の最上位レベルのページパッケージにはframeが含まれており、これらのframeはここに記載されているいずれかの理由でキャッシュできません. ページは1つのframe内にあり、ユーザはこのframe内で新しいページにジャンプし、ここでキャッシュされるのは新しくロードされたページ である.
Jはpageshowイベントを傍受してbfcacheにページが入ることを阻止する
一言ではコードを放さない
Safari、UC、qqブラウザのテストに合格しました.しかし、UC、qqブラウザはbfcacheのページを先にフラッシュします.pageshowはloadイベントがトリガーされた後にトリガーされるからです.browserは依然として赤色を保持しています.browserが前のページに戻ったときにイベントがトリガーされないからだと思います.
JSはpagehideイベントを傍受してページがbfcacheに入ることを阻止する
一言ではコードを放さない html
周華華
html
【Struts 2四】Struts 2ブロッキング
bit1129
struts 2ブロッキング
make:ccコマンドで解決方法が見つかりません
daizj
linux コマンド不明 make cc
OracleのJobアプリケーション
周凡楊
oracle job
マルチスレッドメカニズム
朱輝輝33
マルチスレッド
WebレポートツールFineReportの使用中に発生するよくあるエラーと解決方法(一)
Aさんは振り回さない
Webレポート finereport JAvaレポート レポートツール
mysql rpmインストール後myはありません。cnf
林鶴天
いいえcnf
Kindle Fire HDX root GoogleサービスフレームワークをインストールしてもGoogleアカウントにログインできない問題
aigo
root
アルファベットで分類:
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z その他
トップページ -
私たちについて -
構内検索 -
Sitemap -
権利侵害苦情
著作権すべてのIT知識ベースCopyRight© 2000-2050 IT知識ベースIT 610.com , All Rights Reserved.
京ICP備09083238号
1つのケースを見てみましょう.1つのリストページでは、ページがロードされるたびにonload()イベントがajax方式で最新のリスト資料を再取得すると予想されています.そのため、クリックしてページに戻ると、ユーザーはすぐに最新のリスト資料を見ることができるはずです.その後、一部のブラウザでは、前のページに戻ると更新後の資料が自動的にロードされないことがわかり、再ロードするにはリフレッシュが必要です.これは、一部のブラウザでは、後退時にonloadイベントがトリガーされないためです.これはHTML 5世代ブラウザの新しい特性の一つであるBack-Forward Cache(bfcacheと略称)です.
bfcacheとは
私たちがよく知っている赤い本「JavaScript高級プログラム設計」にはbfcacheが言及されています.
bfcache、すなわちback-forward cacheは、「往復キャッシュ」と呼ばれ、ブラウザの「後退」ボタンと「前進」ボタンを使用すると、ページの変換速度を速めることができます.このキャッシュはページデータだけでなくDOMやJSの状態も保存しており,実際にはページ全体をメモリに保存している.ページがbfcacheにある場合、再びページを開くとonloadイベントはトリガーされません.
Pageshowイベント
このイベントは、bfcacheからのページかどうかにかかわらず、ページ表示時にトリガーされます.再ロードされたページでは、pageshowはloadイベントがトリガーされた後にトリガーされます.bfcacheのページではpageshowがページ状態が完全に回復した瞬間にトリガーされます.
pagehideイベント
このイベントは、ブラウザがページをアンインストールしたときにトリガーされ、unloadイベントの前にトリガーされます.
persistedプロパティ
pageshowイベントとpagehideイベントのeventオブジェクトにはpersistedというブール値属性も含まれています.
ブラウザによっては、現在のウィンドウの「開く」履歴の前のページの表現が統一されず、ブラウザの実装やページ自体の設定に関係します.
テスト
テストコード
ラインの例
<html>
<head>
<title>Page Eventstitle>
<meta charset="utf-8">
<script>
function appendFunc(msg){
var d = new Date();
var li = document.createElement("li");
li.innerHTML = d.toISOString().substr(14, 9) + " " + msg;
document.querySelector("ul").appendChild(li);
}
window.addEventListener('load', function(){
appendFunc('Load Event');
document.querySelector("#changeColor").onclick = function(){
document.querySelector("a").style.color = "red";
}
})
window.addEventListener('pagehide', function( e ){
appendFunc("Pagehide Event");
appendFunc("pagehide persisted is :" + e.persisted);
})
window.addEventListener('pageshow', function( e ){
appendFunc("Pageshow Event");
appendFunc("pageshow persisted is :" + e.persisted);
})
script>
head>
<body>
<a href="http://www.sina.com.cn/"> a>
<input type="button" id="changeColor" value=" " />
<ul>ul>
body>
html>
テスト結果
browser
result
IE 11
新しい読み込みはloadとpageshowイベントをトリガーし、赤は保持されず、bfcacheはありません.
Chrome 52.0.2743.116
新しい読み込みはloadとpageshowイベントをトリガーし、赤は保持されず、bfcacheはありません.
Opera 39.0
新しい読み込みはloadとpageshowイベントをトリガーし、赤は保持されず、bfcacheはありません.
Firefox 48.0.2
新しくロードするとloadとpageshowイベントがトリガーされ、ポイントが大新浪に向かうとpagehideイベントがトリガーされますが、bfcacheには保存されません.赤は保持されていません.
Safari(iPhone) iOS 9.3.5
新しくロードするとloadとpageshowイベントがトリガーされ、点が大新浪に向かうとpagehideイベントがトリガーされ、bfcacheに格納され、赤色が保持されます.
UC
新しくロードするとloadとpageshowイベントがトリガーされ、点が大新浪に向かうとpagehideイベントがトリガーされ、bfcacheに格納され、赤色が保持されます.
qqブラウザ
新しくロードするとloadとpageshowイベントがトリガーされ、ポイントが大新浪に向かうとpagehideイベントがトリガーされ、bfcacheが格納されていないことを示しますが、赤は保持され、bfcacheはありますがpagehideイベントをサポートしていないpersistedプロパティ(疑い)
browser
新しい読み込みはloadとpageshowイベントをトリガーし、前のページに戻るとイベントはトリガーされず赤が保持され、bfcache(疑い)があります.
Safari、Firefox、UC、qqブラウザ、browserにbfcacheがあることがわかります.前ページに戻ると、
ソリューション
Firefoxの開発者ドキュメントには、次のようなアイデアが用意されています.
Jはpageshowイベントを傍受してbfcacheにページが入ることを阻止する
一言ではコードを放さない
window.addEventListener('pageshow', function( e ){
if (e.persisted) {
window.location.reload()
}
})
Safari、UC、qqブラウザのテストに合格しました.しかし、UC、qqブラウザはbfcacheのページを先にフラッシュします.pageshowはloadイベントがトリガーされた後にトリガーされるからです.browserは依然として赤色を保持しています.browserが前のページに戻ったときにイベントがトリガーされないからだと思います.
JSはpagehideイベントを傍受してページがbfcacheに入ることを阻止する
一言ではコードを放さない
window.addEventListener('pagehide', function(e) {
var $body = $(document.body);
$body.children().remove();
// , script
setTimeout(function() {
$body.append("window.location.reload();<\/script>"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
</code></pre>
<p>Safari、UC、qq 。browser , browser 。</p>
<h3> Cache-Control header</h3>
<p> :<br> jsp header :</p>
<pre><code class="prism language-html"><span class="token tag"><span class="token tag"><span class="token punctuation"><</span>head</span><span class="token punctuation">></span></span>
<%
response.setHeader("Cache-Control","no-cache,no-store,must-revalidate");
response.setHeader("Expires", "0");
response.setHeader("Pragma","no-cache");
%>
<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>head</span><span class="token punctuation">></span></span>
</code></pre>
<h3> webview cache </h3>
<p> server , jsp html。 。</p>
<pre><code class="prism language-html"><span class="token comment"><!-- webview START --></span>
<span class="token tag"><span class="token tag"><span class="token punctuation"><</span><span class="token namespace">jsp:</span>useBean</span> <span class="token attr-name">id</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>now<span class="token punctuation">"</span></span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>java.util.Date<span class="token punctuation">"</span></span> <span class="token punctuation">/></span></span>
<span class="token tag"><span class="token tag"><span class="token punctuation"><</span>input</span> <span class="token attr-name">type</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>hidden<span class="token punctuation">"</span></span> <span class="token attr-name">id</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>SERVER_TIME<span class="token punctuation">"</span></span> <span class="token attr-name">value</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>${now.getTime()}<span class="token punctuation">"</span></span><span class="token punctuation">/></span></span>
<span class="token tag"><span class="token tag"><span class="token punctuation"><</span>script</span><span class="token punctuation">></span></span><span class="token script language-javascript">
<span class="token comment">// webview H5 , server time </span>
<span class="token keyword">var</span> <span class="token constant">SERVER_TIME</span> <span class="token operator">=</span> document<span class="token punctuation">.</span><span class="token function">getElementById</span><span class="token punctuation">(</span><span class="token string">"SERVER_TIME"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">var</span> <span class="token constant">REMOTE_VER</span> <span class="token operator">=</span> <span class="token constant">SERVER_TIME</span> <span class="token operator">&&</span> <span class="token constant">SERVER_TIME</span><span class="token punctuation">.</span>value<span class="token punctuation">;</span>
<span class="token keyword">if</span><span class="token punctuation">(</span><span class="token constant">REMOTE_VER</span><span class="token punctuation">)</span><span class="token punctuation">{</span>
<span class="token keyword">var</span> <span class="token constant">LOCAL_VER</span> <span class="token operator">=</span> sessionStorage <span class="token operator">&&</span> sessionStorage<span class="token punctuation">.</span><span class="token constant">PAGEVERSION</span><span class="token punctuation">;</span>
<span class="token keyword">if</span><span class="token punctuation">(</span><span class="token constant">LOCAL_VER</span> <span class="token operator">&&</span> <span class="token function">parseInt</span><span class="token punctuation">(</span><span class="token constant">LOCAL_VER</span><span class="token punctuation">)</span> <span class="token operator">>=</span> <span class="token function">parseInt</span><span class="token punctuation">(</span><span class="token constant">REMOTE_VER</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">{</span>
<span class="token comment">// html </span>
location<span class="token punctuation">.</span><span class="token function">reload</span><span class="token punctuation">(</span><span class="token boolean">true</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span><span class="token keyword">else</span><span class="token punctuation">{</span>
<span class="token comment">// html server , LOCAL_VER</span>
sessionStorage<span class="token punctuation">.</span><span class="token constant">PAGEVERSION</span> <span class="token operator">=</span> <span class="token constant">REMOTE_VER</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span>
</span><span class="token tag"><span class="token tag"><span class="token punctuation"></</span>script</span><span class="token punctuation">></span></span>
<span class="token comment"><!-- webview END --></span>
</code></pre>
<h2> </h2>
<ol>
<li> <p>PC , header </p> </li>
<li> <p> bfcache/page cache ,JS pageshow/pagehide, </p> </li>
<li> <p> 2 work , HTML , </p> </li>
</ol>
<h2> </h2>
<ul>
<li>Forcing mobile Safari to re-evaluate the cached page when user presses back button</li>
<li>H5 webview </li>
<li> onLoad </li>
<li>BFcache </li>
</ul>
</div>
</div>
</div>
</div>
</div>
<!--PC WAP -->
<div id="SOHUCS" sid="1281078937400655872"></div>
<script type="text/javascript" src="/views/front/js/chanyan.js">
興味があるかもしれません周華華
html
bit1129
struts 2ブロッキング
daizj
linux コマンド不明 make cc
周凡楊
oracle job
朱輝輝33
マルチスレッド
Aさんは振り回さない
Webレポート finereport JAvaレポート レポートツール
林鶴天
いいえcnf
aigo
root
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z その他
トップページ -
私たちについて -
構内検索 -
Sitemap -
権利侵害苦情
著作権すべてのIT知識ベースCopyRight© 2000-2050 IT知識ベースIT 610.com , All Rights Reserved.
京ICP備09083238号