2012-04-06 11 views
2

今、ユーザーが自分のサイトのリンクをクリックすると、ajaxを使用してメインフレーム(ヘッダーとサイドバーページ全体に状態を維持する必要があるため、再ロードする必要はありません)。私は、urlバーを変更するためにpushStateとpopStateを使用します。ユーザーがページを去るときにajaxが読み込まれたhtmlを非表示にする方法

私は明示的にajaxコンテンツをキャッシュしません。私のサイトはうまく動作しますが、特に「バック」コマンドでは遅すぎます。

xhr html要求をキャッシュすると、サイトは内部的にうまく機能します。しかし、ユーザーが新しいURLを入力してサイトを離れる場合、 'back'コマンドを押すと、ヘッダーとサイドバーなしのメインビューのコンテンツのみがキャッシュから取り出され、正しく表示されません。

私は内部的にキャッシュすることはできますが、ユーザーがページを離れる場合はキャッシュをフラッシュする方法はありますか?

+1

domreadyで一意のIDを生成しようとしましたが、ドキュメントの存続期間のすべての要求に対して同じ一意のIDを使用しましたか? –

+0

ユーザーがページを離れるときを検出する方法はないと思います。 –

+0

Victor、 'window.onbeforeunload'がありますが、私が聞いたことから、ポップアップメッセージでユーザーを効果的に止めることができます。私がキャッシュをクリアする方法を知っていたなら、ユーザが離れる前にそれが時間内に動いたかどうかを知ることができました。 –

答えて

1

私は今あなたの説明を理解すると思います。

あなたのサイトで/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をサポートしていない場合、通常のリンクナビゲーションが行われます。

+0

Seanの提案に感謝します。残念ながら、私はそれらを効果的に実装するのに苦労しています。 pjaxのデモは、実際にはChromeのオンラインデモでさえ言うことを実際に行っているようには見えません。そのたびにページ全体がリロードされます。 jqueryの最新バージョンでは動作しなくなる可能性があります。 HTMLDecorに関しては、私があなたの設定例を複製しようとしているにもかかわらず、 'hide'関数の' document.head.insertBefore(script、style) 'のDOM要素が見つからないというエラーが出ます。私はそれを持って遊んで、私はそれを動作させることができるかどうかを確認します。あなたのデモは動作します –

+0

@ trespassers-w:pjax [online demo](http://pjax.heroku.com/)では、pushStateを有効にするためのチェックボックスをオンにする必要があります。それを行ってもまだ動作しない場合、私はpjaxの開発者がバグ報告を感謝すると確信しています。 –

+0

@ trespassers-w:情報RE:HTMLDecorをありがとう。エラーメッセージは、HTMLDecorスクリプトがページの ''に含まれていないことを示します。これはHTMLDecorの間違った前提です。 HTMLDecorに関するその他のご質問は、[プロジェクトサイト](http://github.com/shogun70/HTMLDecor)からご連絡ください。 –

関連する問題