Note: この記事は、3年以上前に書かれています。Webの進化は速い!情報の正確性は自己責任で判断してください。
XMLHttpRequestは、スクリプト言語からサーバとのHTTP通信を行うための組み込みオブジェクト(API)。既に読み込んだページ上からHTTPリクエストを発することができるため、ページ遷移なしでサーバとのデータ送受信が可能になる。Ajaxの基幹技術。
実装にあたって、おおかまかな手順は以下。
文字コードはUTF-8にしておこう。
- XMLHttpRequestオブジェクトを作成
- XMLHttpRequestオブジェクトからデータを取得
- 取得したデータを編集、利用
ただしセキュリティ上の問題から、リクエストの送信は同一ドメイン内に制限されている。そのため、ドメインを越えてデータを交換するには以下のような方法をとる必要がある。
- Perlなど、サーバーサイドでデータを取得
- Flashのクロスドメイン通信の機能を経由させる
- ScriptタグからJavascriptプログラムとして取得(JSONPなど)
memo: もとはマイクロソフトがIE-5においてActiveXオブジェクトとして実装したのが始まりらしい。
XMLHttpRequestオブジェクトを作成する
createHttpRequest = function(){
var req = window.XMLHttpRequest ? new XMLHttpRequest() :
(function(){
try { return new ActiveXObject("Msxml2.XMLHTTP"); }
catch(e) {
try { return new ActiveXObject("Microsoft.XMLHTTP"); }
catch(e) { return null; }
}
})();
return req;
}
XMLHttpRequestが使えない場合、ActiveXで代用することでIEに対応。
送信する
POSTメソッドを使って送信する場合、必ずContent-Typeヘッダを設定しなければならない。受信したヘッダは、受信完了後に getResponseHeader メソッドを使って取得できる
GETメソッドの場合は不要。Cookieヘッダを付加させてCookie送信をすることもできる。
req.setRequestHeader(
"Content-Type",
"application/x-www-form-urlencoded;charset=UTF-8"
);
さらにPOSTメソッドの場合には、送信するパラメータを作成する。
var parameter =
"value1=" + encodeURIComponent(document.getElementById('value1').value)
+ "&" +
"value2=" + encodeURIComponent(document.getElementById('value2').value);
準備ができたので、送信する。
req.send(parameter);
req.open('GET', 'http://example.jp/calc.php?' + parameter, true);
req.send("");
1行目がPOSTの場合。2~3行目が、GETの場合。
注意点として、GETメソッドの場合には標準で「キャッシュが働く」。つまりsendメソッドを呼び出しても実際にはサーバへ要求が送られず、ブラウザ内のキャッシュデータが取得されてしまい、最新の情報が取得できない可能性がある。対策としては、以下のような方法が考えられる。
- キャッシュを無効にするヘッダを付ける
→ 「Pragma:no-cache」や「Cache-Control:no-cache」など - URLが前回と同じにならないようにする
→ 「/?ver=20070411」など
受信する
req.onreadystatechange = function;
if (req.readyState == 4 && req.status == 200) {
req.responseText // テキスト形式で取得する
req.responseXML // XML DOM形式で取得する
}
1~3行目のプロパティに関しては、以下。
onreadystatechange | XMLHttpRequestオブジェクトの状態(readystate)が変化すると呼び出されるイベントハンドラ |
---|---|
readystate | 通信の状態を返す。
|
status | HTTPステータスコードを取得する。つまり、ファイルを見つけると200を返す。サーバーを介した通信時のみ有効。 |
動作サンプル
RSSファイルから最新記事一覧を引っ張ってくるサンプル。
Note: スパム対策が面倒なので、コメント投稿を廃止しました。以前のコメントは残します。
ご意見・ご要望はtwitter@sigwygかはてブコメントにて。
2 Comments
どっか気になるところでもありました? 2007–04–13 00:41