ヒストリーについて(History)
| ・ | ヒストリーについて |
| ・ | ヒストリーのプロパティについて |
| ・ | セッション履歴内の任意のページに移動する |
| ・ | 新しいセッション履歴を作成する(HTML5世代) |
| ・ | 現在のセッション履歴を上書きする(HTML5世代) |
| ・ | セッション履歴の進戻操作が発生したか調べる |
ヒストリーについて
■ヒストリーについて
ヒストリーは、セッション履歴を制御する機能がまとまっています。
■ History オブジェクトを取得する
History オブジェクトを取得するには、window.history プロパティを使用します。
ヒストリーオブジェクトを取得する
// ヒストリーオブジェクトを取得する
var history_obj = window.history;
// 出力テスト
console.log(history_obj);
■セキュリティについて
作成側から、開いた先のウィンドウのセッション履歴を制御する場合、生成元(オリジン)が一致している必要があります。
「自身のウィンドウ」のセッション履歴を制御する場合、「作成主」とオリジンが一致している必要はありません。
■HTML5 世代の API について
HTML5 世代の API は、Internet Explorer 10 以降で利用可能です。
HTML5 世代の API を利用すると、シームレスなコンテンツを作成することができます。
新しいページに遷移した時や、セッション履歴の進戻操作を行った時に、ページ全体の読み込みや DOM ツリーの再構築を阻止する事ができます。
ただし、過去の世代でも、「フラグメント識別子」付きの URL アドレスを駆使すれば、実現は可能です。
また、同一アドレス内で、セッション履歴の進戻操作を UI のように利用する事もできます。
W3C により、仕様が勧告されています。
http://www.w3.org/TR/html5/browsers.html#the-history-interface (HTML5 History interface)
ヒストリーのプロパティについて
■ヒストリーのプロパティ一覧
History インターフェースで利用可能な、プロパティの一覧です。
| プロパティ名 | 型 | 説明 |
| length | Number | セッション履歴の総数を取得する。 |
| state | Object | 現在のページのセッション履歴のステートを取得する。(HTML5世代) |
セッション履歴内の任意のページに移動する
■1つ前のページに戻る
1つ前のページに戻るには、history.back() メソッドを使用します。
前のページに戻る(自身のウィンドウ)
// 1つ前のページに戻る
history.back();
■次のページに進む
1つ次のページに進むには、history.forward() メソッドを使用します。
1つ次のページに進む(自身のウィンドウ)
// 1つ次のページに進む
history.forward();
■セッション履歴内の任意のページに移動する(相対指定)
セッション履歴内の任意のページに移動するには、history.go() メソッドを使用します。
引数に相対位置を指定します。
セッション履歴の総数を取得するには、length プロパティを使用します。
セッション履歴の現在の位置を取得する方法はありません。
History.go( 相対位置 ) :Void
| 第01引数(略可) | Number | 進戻したい相対的なページ数を指定する。正数で進む。負数で戻る。0 で現在のページをリロード。省略した場合 0。 |
| 戻り値 | Void | なし |
2つ次のページに進む(自身のウィンドウ)
// 2つ次のページに進む
history.go(2);
1つ前のページに戻る(自身のウィンドウ)
// 1つ前のページに戻る
history.go(-1);
新しいセッション履歴を作成する(HTML5世代)
■新しいセッション履歴を作成する(HTML5世代)
新しいセッション履歴を1つ作成して、新しいアドレスに遷移するには、pushState() メソッドを使用します。
新しいアドレスへの読み込みアクセスは発生しません。現在の DOM 構造は何も変化しません。
変化するのは、「セッション履歴」や「現在の URL」だけです。
新しいページのコンテンツを表示したい場合、自らリソースを読み込み、DOM を更新する必要があります。
セッション履歴を1つ分戻った場合も、同様の動作となります。
History.pushState( ステート情報 , "タイトル" , "URLアドレス" ) :Void
| 第01引数 | Object | 新しいページ用のステート情報を指定する。現在のページ用ではない。参照データはすべてコピーされる。 |
| 第02引数 | String | タイトル情報を指定する。 |
| 第03引数(略可) | String | URL アドレス情報を指定する。 |
| 戻り値 | Void | なし |
■第01引数(ステート情報)
セッション履歴の進戻操作を行った時に、ページを復元するために必要な情報を指定します。
ここで指定するステート情報は、「現在のページ」ではなく、「新しいページ」用である事に注意してください。
進戻操作が発生したか調べるには、onpopstate イベントを使用します。
■第02引数(タイトル)
新しいページのタイトル用の文字列を指定します。
大抵のブラウザが未対応です。
■第03引数(URLアドレス)
新しいページの URL アドレスを指定します。
現在のアドレスと、新しいアドレスの、生成元(オリジン)が一致している必要があります。
アドレスが異なる場合、ローカル環境では動作しません。
動作確認を行う場合、サーバーにアップロードしてから閲覧する必要があります。
ステート情報だけ書き込みたい場合は省略します。(1つのページ内だけで動作するゲームや Web アプリなど)
■使用例
マウスボタンをクリックするたびに、新しいセッション履歴を作成する
// ヒストリーが HTML5 世代の API に対応している
if(history.pushState){
// ------------------------------------------------------------
// マウスボタンをクリックすると実行されるイベント
// ------------------------------------------------------------
document.onclick = function (e){
// ステート情報
var state = { test:0 };
// タイトル
var title = "";
// テスト用のアドレス
var url = "#TEST_URL_" + Math.floor(Math.random() * 0xFFFFFFFF);
// 新しいセッション履歴を1つ作成して、新しいアドレスに遷移する
history.pushState(state , title , url);
};
}
現在のセッション履歴を上書きする(HTML5世代)
■現在のセッション履歴を上書きする(HTML5世代)
現在のページのセッション履歴を上書きし、新しいアドレスに遷移するには、replaceState() メソッドを使用します。
現在のページのステート情報のみを、書き込み更新したい場合にも使用します。
新しいアドレスへの読み込みアクセスは発生しません。現在の DOM 構造は何も変化しません。
変化するのは、「セッション履歴」や「現在の URL」だけです。
新しいページのコンテンツを表示したい場合、自らリソースを読み込み、DOM を更新する必要があります。
History.replaceState( ステート情報 , "タイトル" , "URLアドレス" ) :Void
| 第01引数 | Object | 現在のページ用のステート情報を指定する。参照データはすべてコピーされる。 |
| 第02引数 | String | タイトル情報を指定する。 |
| 第03引数(略可) | String | URL アドレス情報を指定する。 |
| 戻り値 | Void | なし |
■第01引数(ステート情報)
セッション履歴の進戻操作を行った時に、ページを復元するために必要な情報を指定します。
進戻操作が発生したか調べるには、onpopstate イベントを使用します。
■第02引数(タイトル)
新しいページのタイトル用の文字列を指定します。
大抵のブラウザが未対応です。
■第03引数(URLアドレス)
新しいページの URL アドレスを指定します。
指定した場合、遷移後に元のページに戻ることはできません。
今まで開いていたページのセッション履歴(1回分)が、移動先のアドレスで上書きされ、消滅します。
現在のアドレスと、新しいアドレスの、生成元(オリジン)が一致している必要があります。
アドレスが異なる場合、ローカル環境では動作しません。
動作確認を行う場合、サーバーにアップロードしてから閲覧する必要があります。
ステート情報だけ書き込みたい場合は省略します。(1つのページ内だけで動作するゲームや Web アプリなど)
■使用例
マウスボタンをクリックするたびに、現在のセッション履歴を上書きし、新しいアドレスに遷移する
// ヒストリーが HTML5 世代の API に対応している
if(history.replaceState){
// ------------------------------------------------------------
// マウスボタンをクリックすると実行されるイベント
// ------------------------------------------------------------
document.onclick = function (e){
// ステート情報
var state = { test:0 };
// タイトル
var title = "";
// テスト用のアドレス
var url = "#TEST_URL_" + Math.floor(Math.random() * 0xFFFFFFFF);
// 現在のセッション履歴を上書きして、新しいアドレスに遷移する
history.replaceState(state , title , url);
};
}
セッション履歴の進戻操作が発生したか調べる
■セッション履歴の進戻操作が発生したか調べる(HTML5世代)
セッション履歴の進戻操作が発生したか調べるには、onpopstate イベントを使用します。
このイベントは、ページの遷移が完了した直後に発行されます。
ページの遷移が発生する直前に発行されるイベントはありません。
■イベントからステート情報を取得する
登録したコールバック関数の引数から、PopStateEvent オブジェクトが得られます。
PopStateEvent オブジェクトの state プロパティから、ステート情報が得られます。
History オブジェクトの state プロパティから、ステート情報を得る事もできます。
■ステート情報を使って復元する場合の注意点
セッション履歴の進戻操作を、事前に知る方法はありません。
もしスクロールバーの位置などを復元したい場合、頻繁に replaceState() メソッドを実行する事になります。
しかし、replaceState() メソッドは、頻繁に実行しないほうがいいでしょう。
ブラウザによっては描画が大きく崩れたり、再読み込みボタンが激しく点滅してしまいます。
ステート情報には、ページを復元するためのインデックス情報のみを書き込みます。
復元に必要な詳細な情報は、変数やウェブストレージを利用します。
■使用例
マウスボタンをクリックするたびに、新しいセッション履歴を作成する
// セッション履歴の位置
var history_pos = 0;
// ヒストリーが HTML5 世代の API に対応している
if(history.pushState){
// ------------------------------------------------------------
// ステート情報の初期値をセット(開始時のステート情報は null なので書き込み更新する)
// ------------------------------------------------------------
// ステート情報
var state = {pos:history_pos};
// 現在のページのセッション履歴を上書きする
history.replaceState(state , "");
// ------------------------------------------------------------
// マウスボタンをクリックすると実行されるイベント
// ------------------------------------------------------------
document.onclick = function (e){
// セッション履歴の位置を加算
history_pos += 1;
// ステート情報
var state = {pos:history_pos};
// テスト用のアドレス
var url = "#TEST_URL_" + history_pos;
// 新しいセッション履歴を1つ作成して、新しいアドレスに遷移する
history.pushState(state , "" , url);
// 出力テスト
console.log("新しいセッション履歴を作成した URL:" + location.href);
console.log(history.state);
};
// ------------------------------------------------------------
// セッション履歴の進戻操作を行うと実行されるイベント
// ------------------------------------------------------------
window.onpopstate = function (e){
// 復元できないので無視
if(!e.state) return;
// セッション履歴の位置を復元
history_pos = e.state.pos;
// 出力テスト
console.log("セッション履歴の進戻操作を行った URL:" + location.href);
console.log(e.state);
};
}
■ URL アドレスのハッシュ部分(フラグメント識別子)が変化したか調べる
URL アドレスのハッシュ部分(フラグメント識別子)が変化したか調べるには、onhashchange メソッドを使用します。
Internet Explorer 7 以前では、対応していません。
■イベントから URL アドレス情報を取得する
登録したコールバック関数の引数から、HashChangeEvent オブジェクトが得られます。
oldURL プロパティから、変化前の URL アドレスが得られます。
newURL プロパティから、変化後の URL アドレスが得られます。
■使用例
マウスボタンをクリックして、onhashchange イベントの動作を確認する
var pos = 0;
// ------------------------------------------------------------
// マウスボタンをクリックすると実行されるイベント
// ------------------------------------------------------------
document.onclick = function (e){
// テスト用のアドレス
var url = "#TEST_URL_" + pos;
pos += 1;
// 新しいアドレスに遷移する
location.assign(url);
};
// ------------------------------------------------------------
// URL アドレスのハッシュ部分が変化すると実行されるイベント
// ------------------------------------------------------------
window.onhashchange = function (e){
// 出力テスト
console.log("old:" + e.oldURL);
console.log("new:" + e.newURL);
};