私は今あなたの説明を理解すると思います。
あなたのサイトで/page1.htmlにアクセスすると、ダウンロードされたHTMLにはメインコンテンツ+ヘッダー+サイドバーがあります。 /page2.htmlにアクセスするためのリンクをクリックすると、AJAXがページを読み込み、ダウンロードされたHTMLにはメインコンテンツのみが表示されます。私はあなたのサイトを離れ、その後のバックボタンで戻ったとき
ので、この時点でキャッシュは、
今フル/page1.htmlと部分/page2.htmlが含まれ、ブラウザが/ PAGE2をつかみます.htmlをキャッシュから削除します。しかしそれは部分的なページに過ぎず、あなたのサイトは "壊れます"。
理想的には、XMLHttpRequestでリクエストされた場合にのみブラウザが部分コンテンツを取得するようにします。 また、部分ページと全ページの両方をキャッシュできればいいです。
pjaxは、AJAXリクエストのURLクエリに_pjax=true
paramを追加することで、この問題を解決します。私はこれがほとんどのシナリオでうまくいくはずだと思います。
pushState()
に渡すURLにこのパラメータを追加しないように注意してください。
これに代わる方法は、全ページをダウンロードしてから、AJAXを使用するときは#main-view
を抽出することです。
もちろん、PJAXに切り替えることで他人の問題にすることができます(fragment
オプションを使用する必要があります)。
あなたのためにpushState()を処理する別のJSライブラリは、私のHTMLDecorプロジェクトです。 HTMLDecorでは、ページにはメインコンテンツ+ <link>
のみが含まれ、ヘッダー/フッター/サイドバーを含む別の(おそらく共有されている)HTMLページになります。 HTMLDecorはこれらをブラウザ内のページに追加します。ユーザーが別のページを参照するリンクをクリックすると、HTMLDecorはAJAXとpushStateを使用します。設定は必要ありません。もちろん、ブラウザがpushStateをサポートしていない場合、通常のリンクナビゲーションが行われます。
domreadyで一意のIDを生成しようとしましたが、ドキュメントの存続期間のすべての要求に対して同じ一意のIDを使用しましたか? –
ユーザーがページを離れるときを検出する方法はないと思います。 –
Victor、 'window.onbeforeunload'がありますが、私が聞いたことから、ポップアップメッセージでユーザーを効果的に止めることができます。私がキャッシュをクリアする方法を知っていたなら、ユーザが離れる前にそれが時間内に動いたかどうかを知ることができました。 –