基本的な概念と構文
History APIは、1つのDOMインターフェイス-Historyオブジェクトに依存しています。 各タブには、
window.history
ある一意のHistoryオブジェクトがあります。 履歴には、JavaScriptから制御できるいくつかのメソッド、イベント、およびプロパティがあります。 各タブページ(ドキュメントオブジェクト)は、Historyコレクションのオブジェクトです。 ストーリーの各要素は、URLおよび/または状態オブジェクト(状態オブジェクト)で構成され、タイトル(タイトル)、ドキュメントオブジェクト、フォームデータ、スクロール位置、およびページに関連するその他の情報を持つことができます。
Historyオブジェクトの主なメソッド:
-
window.history.length
:現在の履歴セッションのエントリ数 -
window.history.state
:現在の履歴オブジェクトを返します -
window.history.go(n)
:歴史を歩き回ることができるメソッド。 引数は、現在位置からのオフセットです。 0が渡されると、現在のページが更新されます。 インデックスが履歴を超えた場合、何も起こりません。 -
window.history.back()
:go(-1)
を呼び出すのと同じメソッド -
window.history.forward()
:go(1)
を呼び出すのと同じメソッド -
window.history.pushState(data, title [, url])
:履歴要素を追加します。 -
window.history.replaceState(data, title [, url])
:現在の履歴アイテムを更新します
履歴を2ステップ戻すには、次を使用できます。
history.go(-2)
ストーリーアイテムを追加するには、
history.pushState
を使用できます
history.pushState
history.pushState({foo: 'bar'}, 'Title', '/baz.html')
履歴レコードを変更するには、
history.replaceState
を使用できます
history.replaceState
history.replaceState({foo: 'bat'}, 'New Title')
生きている例
これで基本がわかったので、実際の例を見てみましょう。 選択した画像のURIを見つけることができるWebファイルマネージャーを実行します( 最後に何が起こるかを参照してください )。 ファイルマネージャは、JavaScriptで記述された単純なファイル構造を使用します。 ファイルまたはフォルダーを選択すると、画像が動的に更新されます。
data-*
属性を使用して各画像のタイトルを保存し、データセットプロパティを使用してこのプロパティを取得します。
<li class="photo"> <a href="crab2.png" data-note="Grey crab!">crab2.png</a> </li>
すべてが迅速に機能するように、すべての画像をロードし、
src
属性を動的に更新します。 この加速は1つの問題を引き起こします-それはボタンを破壊するので、写真を前後に進めることはできません。
HTML5の歴史が助けになります! ファイルを選択するたびに、新しい履歴レコードが作成され
location
ドキュメントの
location
が更新されます(一意の画像URLが含まれます)。 これは、戻るボタンを使用して画像をバイパスできることを意味します。一方、アドレスバーには画像への直接リンクがあり、ブックマークに保存したり、誰かに送信したりできます。
コード
2人のディーバがいます。 1つにはフォルダー構造が含まれ、もう1つには現在の画像が含まれます。 アプリケーション全体はJavaScriptを使用して管理されます。 最も重要なポイントのみが強調表示されます。 この例のソースコードは非常に短く(約80行)、記事全体を読んだ後に参照してください。
bindEvents
メソッドは
popstate
イベントのハンドラーを
bindEvents
ます
popstate
イベントは、ユーザーが履歴を
popstate
ときに呼び出され、アプリケーションがその状態を更新できるようにします。
window.addEventListener('popstate', function(e){ self.loadImage(e.state.path, e.state.note); }, false);
popstate
イベント
popstate
渡される
event
オブジェクトには
state
プロパティがあります。これは、
pushState
または
replaceState
最初の引数として渡したデータです。
ファイル構造を表すdivの
click
イベントにハンドラーをアタッチします。 イベントの委任を使用して、フォルダーを開閉するか、写真をアップロードします(履歴にエントリを追加します)。 どの要素をクリックしたかを理解するために
className
親要素の
className
を確認します。
-これがフォルダである場合、それを開いたり閉じたりします
-これが写真である場合、それを表示し、履歴の要素を追加します
dir.addEventListener('click', function(e){ e.preventDefault(); var f = e.target; // if (f.parentNode.classList.contains('folder')) { // self.toggleFolders(f); } // else if (f.parentNode.classList.contains('photo')){ note = f.dataset ? f.dataset.note : f.getAttribute('data-note'); // self.loadImage(f.textContent, note); // history.pushState({note: note, path:f.textContent}, '', f.textContent); } }, false);
画像の内容を変更し、署名を更新する方法は非常に簡単です。
loadImage: function(path, note){ img.src = path; h2.textContent = note; }
History
オブジェクトの更新されたインターフェースの機能を実証する簡単なアプリケーションを得ました。
pushState
を使用してストーリーアイテムとpopstateイベントを追加し、ページのコンテンツを更新します。 さらに、画像をクリックすると、アドレスバーにその実際のアドレスが表示されます。これを保存したり、誰かに送信したりできます。
いつ使用できますか?
Firefox 4以降
Safari 5以降
Chrome 10以降
Opera 11.5+
iOS Safari 4.2以降
Android 2.2以降
IE ???
履歴APIをサポートするブラウザーのリスト
どこで使用されていますか?
1. Facebook
2. Github-プロジェクトツリーのナビゲーション
3. ???
読む
1. 楽しみと利益のために歴史を操作する
2. WHATWG HTML5履歴API
3. W3C履歴API仕様
4. ブラウザの履歴を操作する MDC
5. History.js-スクリプトは、HTML5履歴API(location.hashマジック)をエミュレートしますが、これをサポートしていないブラウザーでは