Ajaxの基本XMLHttpRequestを試してみた
February 21, 2009 – 12:25 pm前回のエントリー『Javascriptを学習しなくちゃということで・・・・』で、いまや常識のAjaxを学ぼうという話を書いた。JavaScriptを基本から学ばねばということだった。しかし、phpを学習したときと同様、やはり「習うより慣れろ」というのがプログラミングを学ぶには良いのではということで、w3SchoolsにでているAjaxのサンプルを実際に動かしてみることにした。結果、一番簡単なところが、なんとかうまく動作した。なるほどこういうことであったか、悦にいっている。私のAjaxのサンプルがどんな感じで動作するのかを示してみることにした。
Ajaxを実感してみよう!: ご覧になるように、すぐ下に入力フォームが配置されている。Nameと名づけているフォームに適当な文字を打ち込んでみて欲しい。そうすると、Timeのほうになにか数字が現れるはずである。Nameフォームにタイプするたび(キーから指を離すたび)にTimeの部分の値が変化しているのに気づいていただけるだろうか?
この動作を実現するのに、Ajaxの基本であるXMLHttpRequestを用いている。結構、分かり易い例だと思う。以下、ここで示した例が、どのようになっているか、具体的なコーディング例をしめしながら説明してみよう。
JavaScriptの組み込みとフォームの作成: 上にしめしたサンプルを実現するため、このポスト上に、(HTML形式で)書き下したのが以下だ。
<script type="text/javascript" src="/scripts/ajax_sample.js" ></script>
<form name=”myForm”>
<table border="0">
<tbody>
<tr>
<td>Name:</td>
<td><input name="username" type="text" onkeyup="ajaxFunction();"/> </td>
</tr>
<tr>
<td>Time:</td>
<td><input name="time" type="text" /></td>
</tr>
</tbody>
</table>
</form>
まず、一行目に、このサンプルを動作するために準備したJavaScriptファイルajax_sample.jsを定義した。ほぼ2週間前のエントリー「WPのPOST上でGoogle Visualization APIのサンプルを動かしてみた」で書いたように、私が使っているブログツールWordPressのPost上でJavaScriptを使う場合、ここに示したように、JavaScriptコードをPost内に直接書かないでPost 外にJavaScriptファイルを定義しておけばよい。
2行目以降に書いたHTML FORMタグの部分がAjaxのサンプルを動作させるために作成したフォームの部分である。ここでは、HTMLタグについて解説することはしないが、二つのinput要素のうち1番目に、onkeyup=”ajaxFunction();”というかたちで、この入力フォーム中でキーボード入力でキーアップ時にajaxFunction()と名づけたscriptが動作するようにしている。このajaxFunction()は、JavaScriptファイルajax_sample.jsのなかで定義している。
JavaScriptファイル ajax_sample.jsは以下のようなものである;
function ajaxFunction() {
var xmlHttp;
try
{
// Firefox, Opera 8.0+, Safari
xmlHttp=new XMLHttpRequest();
}
catch (e)
{
// Internet Explorer
try
{
xmlHttp=new ActiveXObject("Msxml2.XMLHTTP");
}
catch (e)
{
try
{
xmlHttp=new ActiveXObject("Microsoft.XMLHTTP");
}
catch (e)
{
alert("Your browser does not support AJAX!");
return false;
}
}
}
xmlHttp.onreadystatechange=function()
{
if(xmlHttp.readyState==4)
{
document.myForm.time.value=xmlHttp.responseText;
}
}
xmlHttp.open("GET", "server.php",true);
xmlHttp.send(null);
}
このJavaScriptファイルの内容について見てゆく。try・・catch・・の一連の部分は、XMLHttpRequestを活性化する(オブジェクトを作る)部分だ。ブラウザの違いにより、このXMLHttpRequestという名称の「クラス」(こういう言い方は正しいかどうかは分からない)は、Firefox、Operaといったブラウザ上では成立するようであるが、MSWindows系のブラウザで提供されている「クラスの名称」は異なる。この違いを吸収して、クライアントユーザーが使用しているブラウザに対応した「XMLHttpRequest」のオブジェクトxmlHttpが作られる。
オブジェクトxmlHttpの作成に失敗すると、「Your browser does not support AJAX」なる警告がポップアップされて終了する。
XMLHttpRequestオブジェクトの3つのプロパティ: XMLHttpRequestでAjaxの動作を実現するうえで欠くことのできないpropertyがある。その夫々についてみてみよう。
まず、 onreadystatechangeプロパティだ。書式は、以下の形式をとる:
XMLHttp.onreadystatechange=function()
{
// wirte some code here
}
ここで、function()に書かれるコードは serverからのresponseを処理する。
次に、readyState プロパティだ。 readyStateプロパティはserver からのresponseの状態を保持し、readyStateが変化する度に、上記したonreadystatechangeの function()が実行される。
readyStateには、状態の変化に伴い、0から4が返されてくる。
readyState 対応する状態
0 request が初期化されていない状態
1 request がセットアップされた状態
2 request がserverに送付された状態
3 request がserverで処理中にある状態
4 request が完了した状態
clientからのrequestについてserver側の処理が完結した状態(readyStateが4)になった時点 でなんらかの処理を実行するということで、上記のfunction部分を完成させると、
XMLHttp.onreadystatechange=function()
{
if (XMLHttp.readyState == 4)
{
document.myForm.time.value = XMLHttp.responseText;
}
}
}
ということになる。ここで、responseTextプロパティにserver側からテキストデータが返されており、最初に説明したフォームの2番目のinput要素(name=time)に返された値を格納するという簡単な処理を行っている。
ServerへのRequest: ServerへのRequestを送信するのに open()とsend()のメソドが用いられる。
open()メソドは、3つのargumentを持つ。その夫々は、
第1argument: requestを送信するのにGET、POSTのいずれを使うかを指定する
第2argument: サーバー側のscriptのURLを指定する
第3argument: requestが非同期(asynchronously)に取り扱われるかどうかを指定する。非同期の場合、trueを指定する。
send()メソドは、送付するデータを与えるが、requestの終了を単にserver側に伝える場合には、argumentにnullを与える。
Server側scriptのURLの指定: 以上でclient側というかブラウザ側からの送信処理は終了した。次に、Server側のURLを指定しなければならない。サンプルでは、サーバー側のドキュメントルート配下のディレクトリscripts/に置いたphpファイルserver.phpを与えている。この部分を採録しておくと、
xmlHttp.open(“GET”,”/scripts/server.php”,true);
xmlHttp.send(null);
Serverサイドの処理内容: 単純なserver.phpを以下のように作成している。
<?php
header("Cache-Control: no-cache, must-revalidate");
$time = microtime();
echo $time;
?>
まず、第一行目であるが、これを最初に定義しておくことにより、このphpファイルがコールされるたびにキャッシュ値が返されるのでなく、その時点時点で実行された値が返されることになる(実際には、キャッシュのコントロールをどうするか、きちんと考えておかねばならないだろう)。
次の行では、phpが実行された時点での時間をphpの関数microtime()を用いて変数$timeに格納、それを次のecho文で出力する。これで、実際に、クライアント側に返される値は、$timeの値ということになる。
まとめ: 以上がAjaxを学ぶために作成したサンプルの実行例と、その(私が理解した範囲での)解説である。Ajaxで行なわれる処理は、実際には、より複雑なものを扱うことになるが、その基本的な仕組みはここに記したサンプルで理解できたと思う。
次回(いつになるか分からないが)は、蔵書管理でアマゾンDBの読み取りに用いたphpを使いながら少しは実用的なAjaxのコーディングに挑戦してみることにしたい。
2 Trackback(s)