文書の過去の版を表示しています。
XMLHttpRequest
非同期HTTP通信を実現する。元々は名前の通りXMLデータ通信のためのAPIである。Firefox、Safari、Opera、IE7ではスクリプト実行環境のネイティブオブジェクトとして使用できる。IE6以前ではJScriptのActiveX呼び出しとして使用する。
XMLHttpRequestオブジェクトのメンバ
各ブラウザで共通に使用できるXMLHttpRequestオブジェクトのメンバです。
プロパティ
<html> <dl class=“long”> <dt>onreadystatechange</dt><dd>オブジェクトの状態が変化したときに実行されるイベントハンドラ。関数オブジェクトをセットして通信状態(readyStateプロパティ)が変化したときにコールバックされる関数を指定。</dd> <dt>readyState</dt><dd>オブジェクトの状態を示す値。<br />0 = uninitialized、1 = loading、2 = loaded、3 = interactive、4 = complete<br />readyStateが4のとき、以下に示すプロパティからレスポンスを取得できるようになる。</dd> <dt>responseText</dt><dd>HTTPレスポンスボディを文字列として取得するプロパティ。</dd> <dt>responseXML</dt><dd>HTTPレスポンスボディをDOMドキュメントオブジェクトとして取得できるプロパティ。レスポンスはXML文書でなくてはならない。</dd> <dt>status</dt><dd>HTTPレスポンスステータスコード、200、404等。</dd> <dt>statusText</dt><dd>ステータスコードに対応するメッセージ、200ならOK、404ならNot Found。</dd> </dl> </html>
メソッド
<html> <dl class=“long”> <dt>abort()</dt><dd>通信を中断します。同一のXMLHttpRequestオブジェクトに対して連続でsendする場合、現在の通信をキャンセルする。</dd> <dt>getAllResponseHeaders()</dt><dd>HTTPレスポンスヘッダを全て文字列として取得。</dd> <dt>getResponseHeader(headerLabel)</dt><dd> headerLabelで指定したレスポンスヘッダの内容を取得。</dd> <dt>open(method, URL, asyncFlag, userName, password)</dt><dd>指定したURLに接続する。methodにはPOSTまたはGETを指定する。ブラウザによってはDELETEやPUTを発行することも可能。asyncFlagは、通信を非同期とするかどうかのフラグ。falseを指定するとsendメソッド実行時、通信完了まで処理がブロックされる。userNameとpasswordはBASIC認証のユーザ名、パスワードを指定。asyncFlag, userName, passwordは省略可能。</dd> <dt>send(content)</dt><dd>HTTPリクエストを送信する。contentはレスポンスボディ。レスポンスボディが無い場合はnullを渡すが、Operaではnullを渡すとエラーになるため空文字列を渡す。</dd> <dt>setRequestHeader(label, value)</dt><dd>labelで指定したHTTPリクエストヘッダにvalueをセットする。</dd> </dl> </html>
クロスドメイン制限
XMLHttpRequestによる通信は異なるドメインのサーバと通信することはできない。
例えばこのページ、http://web.paulownia.jp/wiki/ajax/xmlhttprequest から通信できるのは、web.paulownia.jpドメインのURLのみ。ttp:web.paulownia.jp/hoge/fuga.cgi 等にはリクエストを発行できるが、ttp:paulownia.jp/hoge.cgi はダメ。
変な癖?バグ?
- sendメソッドにnullを渡せない。(Opera 8)→空文字を渡す。
- ステータス204の場合、statusが1223になる(IE6)
- setRequestHeaderが存在するのに、動作しない(Opera 8)
- ステータス200で、レスポンスボディが空の場合、statusがundefined(Safari 2)
- リダイレクトレスポンス時に、Locationヘッダが付いていない場合、statusが0(IE6)
- responseTextで日本語が文字化け(Safari 2)→回避法