JavaScript プログラミング講座

 

ヒストリーについて

 


■ヒストリーについて

 
ヒストリーは、セッション履歴を制御する機能がまとまっています。
 
■ 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 インターフェースで利用可能な、プロパティの一覧です。
 
プロパティ名説明
lengthNumberセッション履歴の総数を取得する。
stateObject現在のページのセッション履歴のステートを取得する。(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引数(略可)StringURL アドレス情報を指定する。
戻り値 Voidなし
 
■第01引数(ステート情報)
 
セッション履歴の進戻操作を行った時に、ページを復元するために必要な情報を指定します。
 
ここで指定するステート情報は、「現在のページ」ではなく、「新しいページ」用である事に注意してください。
 
「現在のページ」のステート情報を残したい場合は、先に replaceState() メソッドを使用します。
 
続けて、pushState() メソッドを実行します。
 
進戻操作が発生したか調べるには、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引数(略可)StringURL アドレス情報を指定する。
戻り値 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);
};