Ajax で作ってみる


Ajax の使い方などの説明です。

Ajax / 仕組み / 作り方 / 実行 / 戻る / トップページ


Ajax とは

"Ajax" とは Web アプリケーション開発の新しいアプローチの呼び名です。 簡単に言うと既存の枯れた技術を組み合わせて、 ロード待ちのない Web アプリケーションを作る手法になります。
 
"Asynchronous JavaScript and XML" の 頭文字を取って Ajax (エイジャックス) と呼ばれており、 その名のとおり、JavaScript や XML、CSS、DHTML を組み合わせて 非同期的な処理を実現させます。
 
Google が特にその方面で一歩出ており、 Google サジェスト (検索語を入れている最中から検索候補を探してくれる) や Google Maps (画面をドラッグするだけで、待ち時間なしで地図をスクロールできる) GMail (Web メーラー) で活用されています。 これらは Web 上のボタンやテキスト入力をしている最中から裏で Web サーバーと通信して、結果をページ上に反映するため、 非常に使いやすい操作感を出してくれます。
 
Ajax で作られた Web アプリケーションの実行には Internet Explorer 6.0、Firefox 1.0、以上などの環境が必要ですが、 それ以外に特別インストールするものも必要ないため、手軽に使える利点もあります。

仕組み

ユーザーが Web ページ上のフォーム類を触ると、JavaScript が動き、 JavaScript は XMLHttpRequest オブジェクトを使って リアルタイムにサーバーと通信、 結果を Web ページ自身を書き換えて (Dynamic HTML) 表示します。 XMLHttpRequest オブジェクトは、HTTP リクエストを発行してリソースを 取得したり、取得したりソースを XML として解析して DOM ツリーを 構築する機能があり、これを利用しています。
 
これによってユーザーはページの読み込みを待つことなく、 通常のアプリケーションの感覚で Web アプリケーションを触れます。
 
Ajax はこのような使い方のことに名前を付けただけで、 特別新しいことではありません (しかしその効果は秀逸です)。

作り方

以下は JavaScript, DHTML を知っている方に向けて書きます (CSS, XML は今回は意識しなくても使えます)。
 
Ajax の作り方は基本はシンプルです。
 
まずは、XMLHttpRequest オブジェクトを生成します。 本来は new XMLHttpRequest() だけで良いのですが、ブラウザの互換性の 問題を回避するために以下のような処理でオブジェクト生成します。
	<script language="javascript" type="text/javascript">
	function createXMLHttpRequest()
	{
		var xmlHttp;
	
		xmlHttp=null;
		
		/*@cc_on
		@if (@_jscript_version>=5)
			try {
				xmlHttp=new ActiveXObject("Msxml2.XMLHTTP");
			}
			catch (e)
			{
				try {
					xmlHttp=new ActiveXObject("Microsoft.XMLHTTP");
				}
				catch (e2)
				{
					xmlHttp=null;
				}
			}
		@else
			xmlHttp=null;
		@end @*/
		
		if (xmlHttp==null && (typeof XMLHttpRequest)!="undefined")
		{
			try {
				xmlHttp=new XMLHttpRequest();
			}
			catch (e)
			{
				xmlHttp=null;
			}
		}
		
		return xmlHttp;
	}
	var xmlHttpRequest=createXMLHttpRequest();
	</script>
Gecko エンジン系 (Firefox, Netscape など)、Opera、Safari は 直接生成できますが、Internet Explorer は ActiveXObject と して作る必要があるためです。 これは内容を理解しなくても定型パターンとして書いてしまっても良いです。
 
次に、フォームに JavaScript の関数を呼び出すコードを普通に入れます。
	<form method=get>
	入力:<input type=text name="test" id="input_text" onKeydown="ajax_call_test();">
	</form>
	
	出力:<div id="output"></div>
ここで指定した関数の中で、XMLHttpRequest オブジェクトを使って通信の開始と、 その途中結果を画面に反映させる処理を書きます。
 
XMLHttpRequest オブジェクトの使い方もシンプルです。
	function ajax_stateChanged()
	{
		document.getElementById("output").innerHTML=xmlHttpRequest.statusText;
		
		if (xmlHttpRequest.readyState==4 && xmlHttpRequest.status==200)
		{
			// レスポンス xmlHttpRequest.responseText を HTML に書き込む。
			document.getElementById("output").appendChild(
			    document.createTextNode(xmlHttpRequest.responseText));
		}
	}
	function ajax_call_test()
	{
		if (xmlHttpRequest==null) return;
		
		xmlHttpRequest.open("GET","ajax.html?in="+
		    document.getElementById("input_text"),true);
		xmlHttpRequest.onreadystatechange=ajax_stateChanged;
		xmlHttpRequest.send(null);
	}
open メソッドでサーバーの読み込みたいページ (CGI のページ) を 指定して通信を開きます。 open メソッドの引数は順番に、メソッド (POST か GET か)、アドレス、 読み込み完了まで send 関数の処理を返さないかどうか (true ならすぐに 処理は返ってきてバックグラウンドで通信を行う Ajax 向け)、です。 その後に、XMLHttpRequest オブジェクトの onreadystatechange プロパティに 通信途中に呼ばれる関数を登録します (通常の XMLHttpRequest オブジェクトは open メソッドの前に設定しても大丈夫ですが、 ActiveXObject の場合は open メソッドの後に指定する必要があるようです)。
 
send メソッドで通信を開始します。 send メソッドが呼ばれた後は、読み込みの進行に応じて、 onreadystatechange プロパティに指定した関数が呼ばれるようになります。 readyState プロパティの値が進行状況を示します。
 
readyState プロパティの値と状況
進行状況 内容
0 未初期化 open メソッドが呼ばれる前
1 ロード中 send メソッドが呼ばれる前
2 ロード済み send メソッドが呼ばれた (ヘッダの読み込みが完了)
3 通信進行中 通信中でデータが途中まで読まれた (ActiveXObject はここでヘッダの読み込みが完了 ?)
4 完了 全てのデータが読み込まれた
 
読み込みが完了すると (readyState==4 の時)、responseText プロパティに サーバーからのレスポンスが入っていますので、あとはこれを加工して HTML に反映させれば完成です。 responseXML プロパティには DOM ツリーの形式でデータがありますので、 これを使うこともできます。
 
なお、ブラウザのセキュリティ機能の関係で、ほとんどの場合、 Ajax が書かれた Web ページのダウンロード元のサーバーとしか通信できません。 そのため、他のサーバーとの連携をしたい場合にはサーバー側の CGI などで 他のサーバーと通信するようにするのが一般的です。

実行

一通りのコードを書いたら、あとは Web サーバーにアップロードして、 サーバー側の CGI 等も用意すれば実行できます。

戻る