2013-05-08 13 views
41

これは驚くべきことですが、私はこれが他のサイトでは動作していますが、バックボタンでHTMLを動的に変更したままにする

私はhistory.jsとHistory APIについて知っていますが、URLを変更したくないだけでなく、ブラウザが新しいHTMLコンテンツをキャッシュするようにして、ユーザーがページを離れるときに戻るボタンを使用して戻ってきても、更新されたHTMLはまだ残っています。

URLの変更やハッシュ番号の使用がない他のサイトでは、これが常に動作しています。
これを動作させるための秘訣はありますか、ブラウザによってランダムに決定されていますか?
この情報を得るためにURLを使用したくない場合は、簡単な方法がありますか?

+0

ページの「ステータス」をCookieに保存するとどうなりますか?たとえば、クライアントがクリックしてログインボックスを表示した後、そのアクションをクッキー "login = 1"に保存し、クライアントが戻ったときにjavascriptを使用してクッキーを読み取り、ログインを表示します。私はこれが "最高の"解決策だとは思っていませんが、あまりにも多くの "選択肢"がありますので注意してください。 – HamZa

+1

はい、クッキーとセッションとローカルストレージ、状態を保存する良い方法は、パラメータのように、再読み込みすることです。しかし、私は他のサイトがそれなしで動作して参照してください。ページ全体がajaxで構築されていても、バックボタンを押すと視覚的な遅延はありません。どうやってやっているの? – Madd0g

+0

おそらく、ブラウザがHTMLをキャッシュするときに必要な_before_ onloadページを構築します。 –

答えて

40

約10年半前から、私は一度痛い試行錯誤で発見した2つのトリックを使用しています。入力フィールド値、特に「隠れた」値はURLと共にブラウザの履歴に保存されます - back(またはforward)ボタンでページに戻るときにonLoadイベントが呼び出されます。

これは、非表示フィールド(フォームに入力することを忘れないでください)に、あなたが好きなだけの「状態」を保存してから、「onLoad」で変更を「やり直す」ことを意味します。私は通常、 'レンダリング'パートを別の関数にします。つまり、動的性が発生しているときは、まず隠れたフィールドに書き込んだ後、レンダリング関数を呼び出します。次に、さまざまなダイナミクスのレンダリング関数をまとめて、onLoadから呼び出します。

私はマニュアルの中でこれまで狩りをしたことがないので、何らかの保証をすることはできませんが、私は信頼できるように(Netscape以来)信頼性の高い方法で使用しています。 (すべてのIE、クロム、FF - しかし他のものについては、私は試みたことがない)それについて聞いてください。しかし、これはトリックを行うように見えます。

+1

ちょっと、グーグル、返信いただきありがとうございます。私はそれが手動で行われたことを理解しています(つまり、状態のパラメータを保存してから、ユーザーがページに戻ったときにリロードします)。事は、私は多くのajaxサイト(他のコメントに記載されているようにfirefoxを使用しています)に表示されていますが、私が押し返すとHTMLが残っているので、リロードする必要はありません。私はそれがどのように行われたのか理解したいです。 – Madd0g

+0

あなたも私も... :)あなたが後になっているテクニックが、FF以外のブラウザでもうまくいくかどうかは分かります。私はしばしば古いIEのブラウザに標準化されている政府機関の仕事をしています - まだいくつかはIE6になっていますが(それは希ではありますが)IE7はもう少し長くなります...とにかく、 。質問をしていただきありがとうございます。 – Groover

+1

あなたの返信を再度読んで、私が記述した手法では、ページやその一部を「再読み込み」する、またはURLなどを変更するための実際のサーバートリップは必要ありません。その効果は、ページに戻るための戻るボタン、動的な変更のすべては、最初にajaxによって最初に置かれているかどうか、または単純に、数字の列を合計するなど、ページを初めて見たときに魔法のように適所にあります。これがすでに理解されていれば私を許してください。 :) – Groover

0

私は、他のWebページがセッションを提供するいくつかのバックエンドサーバーを使用しているという理由が考えられます。

静的なhtml/jsページを作成している場合は、このようなセッションやページはリロードされません。

クッキーを使用して必要なものを達成することができます。

+0

もしそれらがlocalstorageのhtmlのページとページを保持していないなら、私はどのように再描画することなく全てを復元することができるのか分かりません。メモリ内の最後のページのパラメータを保持してajaxで呼び出すと、明らかに目に見える変更が加えられ、もっと時間がかかります – Madd0g

1

あなたはこのようなHistory.jsを使用して、あなたの目標を達成することができます

function manageHistory(data){ 

    var History = window.History; 
    if (!History.enabled) { return false; }   
    History.replaceState({myData: data}, null); 
} 

$('select.select').change(function(e) { // I am using select tag here to give an example of an HTML action triggerer 

    e.preventDefault(); 

    // get data from your select tag 

    manageHistory(data) 


}); 

History.Adapter.bind(window, 'statechange', function() { 
    var State = History.getState(); 

    // Launch the ajax call and update DOM using State.data.myData 
}); 

Mozillaのサイトにある歴史に関する文書をよると、PushState 3番目のパラメータは次のとおりです。

URL — ....... This parameter is optional; if it isn't specified, it's set to the document's current URL.

+0

ありがとう、私はそれを行う方法を知っています、私はhistory.jsプラグインでやったそれは、ajax呼び出し時にページのスクロール位置を保存することです。私はpushStateとreplaceStateを試しました。どちらの場合も、バック・ボタンを使用したときにページ・ロード後に作成したhtmlが消えてしまいました。 – Madd0g

9

ここRESの著者、見つかりましたあなたの質問は/ r/javascript

Firefoxは最近、独自にこれを行う機能を追加しましたが、ブラウザが実行しないときにこれを行う「良い」方法はありませんそれはあなたのためです。

RESは、#page = nマーカーを追加するだけです.nはあなたのページ番号です。そういう意味で、pageloadでは、RESはあなたがbackボタンから来ていなければならないことを知っています。もし既に見つかった場所が見つかったら、残念ながら、この特定の動作はCtrl + Fでborkedされます。ハッシュチェンジはユーザーを迷惑にしている検索ダイアログを閉じてしまうため、別のページ(ページ= n + 1)になる可能性があります。

だから、RESはあなたが背中を通ってページに到着したかどうかを推測するために、醜い不完全な体操ボタン。新しいページを読み込むたびに、その番号がsessionStorageに保存されます(localStorageと同じですが、タブにローカルです)。戻るボタンで表示されると、そのページ番号の要求が発生します。

最近、私はFFとChromeでテストしましたが、ハッシュ変更はもはやctrl-f検索ダイアログを「キャンセル」していないようですので、私の提案はそれを使用することでしょう。ページロード時にハッシュが存在する場合、そのハッシュによって決定された関連データをロードします。

実際に夢中になりたい場合は、実際のHTMLコンテンツをlocalStorageに保存し、バックボタンを使ってpageloadにリロードすることもできます。これは最も効率的なやり方ではないかもしれませんが、DOMに依存するjavascriptとの衝突を引き起こす可能性はほとんどありますので注意してください。

"ベスト"ソリューションは、実際にサイトが行っていること/そのコンテンツがどのように見えるか/動作しているかによって大きく異なります。

+0

返信いただきありがとうございます。 RESのNERと同じように、私のサイトは伝統的なページングを使用する代わりに、新しいページのコンテンツをインラインで読み込むだけです。 redditのように、ページ自体は実際には立っていないので、URLを更新すると(ユーザーがpermalinkをコピーできるようになります)、URLが共有されると混乱を招き、避けたかったのです。しかし、それはないようですね。それはとにかく本当の必要条件ではなく、私が避けたいと思っていただけのものです。ありがとう – Madd0g

+0

私は、ブラウザがあなたのためにそれをしないときにこれを行う "良い"方法はありません以外に、これに対してより良い答えを持っていたらいいと思っています。 redditと私のサイトではありません。とにかくありがとうと – Madd0g

+0

私がそれを理解する限り、FFはNERの状態をRedditに保存します。あなたはChromeでもそれを保存していると言っていますか? – honestbleeps

-1

クッキーを使用することをお勧めします。

HTML5はWebstorageを提供しますが、値はブラウザに保存できます。 HTML5 Webstorageを扱ういくつかのJSライブラリもあります。

注:各ブラウザに保存できるデータのサイズには違いがあります。あなたはそれについての詳細を見つけることができますhere。 。

注2:あなたはwebstorageの使用に関するポリシーが更新されることを期待することができるようにいくつかの問題は、ユーザーのディスク容量をハッキングでもあった(http://feross.org/fill-disk/

0

ローカルストレージが一つの方法である、別の方法は、サーバー側の永続性であります。

クライアントサイドでHTMLを編集/作成/一部のプロパティを変更した場合、ページの状態変更をwebstorageまたはデータベースと同期する必要があります(安価なAPIを使用)。

ページに戻ると、ページはローカルストレージから保存された情報を取得できます...サーバー側の永続性を使用している場合は、セッションCookieと組み合わせて使用​​する必要があります状態の変更 - サーバーからロードすることができます。

+0

これは少なくともクロムでは機能しません。キャッシュヘッダーがキャッシュに設定されていなくても、ブラウザがajax getメッセージをキャッシュするように見えます。 – Roey

関連する問題