履歴APIにおけるhashchangeとpopstateの比較
3109 ワード
hashchange
およびpopstate
イベントはいずれもブラウザ履歴APIであり、どちらもHTML 5のAPIであり、popstate
はhashchange
よりも強力である.この2つの履歴管理は、ソースポリシーによって制限されていることに注意してください.ここでは、両者の違いと関連アプリケーションを明らかにします.hashchange
hashchange
イベントは、ブラウザURLにhashが変化した後にトリガーされるイベント(イベントトリガー後にブラウザ履歴にレコードが追加される)であり、URLにおける#
後の内容がhashであり、その変化によってトリガーされるhashchange
イベントがajaxと最もよく組み合わせられている.私の理解では、hashの変化はサーバに要求されないため、hashchange
イベントがなければ、ブラウザの前進と後退ボタンをクリックすると、サーバは反応できません(サーバは要求を受信できないため)、このイベントがあれば、jsを使用してajaxの新しい要求をトリガーしてサーバに応答させることができます.hashchange
イベント自体はhashの変化を監視するだけであり、ajaxと組み合わせて使用することでajaxの下で前進後退ボタンを履歴することが依然として有効であると考えられています.次の簡単なコードを使用して体験できます.
hashchange
Click me foo
Click me bar
hashchangeのドキュメントmark?hashchange
popstate
popstate
イベントは一般的にpushState()
とreplaceState()
の2つの方法と組み合わせて使用され、ユーザーがブラウザの前進後退ボタンをクリックすると、このイベントをサポートするブラウザはpopState
イベントをトリガーし、その名の通り、このイベントがpopしたのはpushState()
メソッドによって保存されたステータススタックであり、ここではpushState()
メソッドの構文を簡単に置き換える.MDNドキュメントから参照します(titleの無視など、firefoxの方法の実装の違いが特に指摘されていることに注意してください).操作ブラウザの履歴:pushState(object,title,url)
popstate
イベントがトリガーされるたびに、イベントオブジェクトのstateプロパティには、pushState()
メソッドで押し込まれた状態オブジェクトが保存されます.「javascript権威ガイド」では例22-3が生き生きとこの使い方を示しています.ここではこの例をcodepenに置きます(リンクをクリックして開き、数字を推測するたびにブラウザの前進後退ボタンを使って状態回復を観察します)、いくつかの注釈を書き直しました.popstateベースのデジタルゲームここでは、
replaceState()
について説明するが、この方法はpushState()
と同様であるが、現在のステータスを最初のパラメータ(ステータスオブジェクト)でアクティブに置き換えるものであり、ブラウザ履歴に履歴を追加することはなく、window.location.replace(url)
に類似している.hashchangeとpopstateの違いのまとめ
hashchange
はhash値が変化するときにのみトリガーされ、popstate
はそれをサポートするブラウザで「前進」「後退」ボタンを押すだけでWindowオブジェクト上でpopstate
イベントは、任意の同源urlの下でトリガーすることができ、すなわちexample.com/page 1とexample.com/page 2ではトリガーできますが、hashchange
はexampleのみです.com/page 1#hashでのみ可能(この点は一応個人的に理解しており、実験はしていない)