Connection Manager(その1)
Connection Manegerは、XMLHttpRequestを処理するためのモジュール類(YUIのConnection Managerのページはこちら)。
よく知られている通り、Ajaxは、Asynchuronous Javascript and XMLの略なので、狭義には、このConnection Mangerでハンドルする「in pageで発生する(ページのreloadを伴わない)非同期なXMLHttpRequestによる処理系」のことを意味する。
一般に知られるようになったのは、Google Mapが公開されたときと記憶している。
JavaScriptライブラリには、Drag and DragやAnimationといった「画面をリッチに飾るための処理系(Effect)」、DomやEventといった「オブジェクト指向言語としてのJavaScriptのヘルパー」が含まれるが、これらを含んだものが、広義のAjaxと認識されている。
Connection Manager handles cross-browser instantiation of XMLHttpRequest, negotiates the server response and uses a callback pattern to process the response data.
と書かれているように、Connection Managerは、クロスブラウザーに対応したXMLHttpRequestの初期化(XMLHttpRequestが、そもそも、IEにおいてActiveXで実装されたものに由来する)、サーバーとのネゴシエーション、(戻ってきた)データの処理をするコールバックパターンのヘルパーである。
YUIにおいて、まず、読み込むファイルは
<!-- Dependency --> <script src="http://yui.yahooapis.com/2.6.0/build/yahoo/yahoo-min.js"> </script> <!-- Used for Custom Events and event listener bindings --> <script src="http://yui.yahooapis.com/2.6.0/build/event/event-min.js"> </script> <!-- Source file --> <script src="http://yui.yahooapis.com/2.6.0/build/connection/connection-min.js"> </script>
と書かれている。event-min.jsは、(後述の)カスタムイベントを利用する際に用いるので、そうでない場合には必要ない。
Connection Managerをつかって、XMLHttpRequestを初期化・実行するためには、以下のように書く。
<script> var transaction = YAHOO.util.Connect.asyncRequest('GET', sUrl, callback, null); </script>
引数は
引数 | 意味 |
第1引数;HTTPのメソッド | HTTPメソッドは、GET、POSTの他にHEAD、DELETE、PUTの計5つがあるが、普通使うのは、GETとPOSTだけ。 |
第2引数;URL | Httpサーバーを呼ぶためのURL |
第3引数;Call Back関数 | Call Back(非同期なHttpサーバーからのレスポンス)を処理する処理系(Call Back Objectと書かれているが、YUIの作法がある) |
第4引数 | POSTで通信するときのPOSTメッセージを入れる(配列) |
Asynchronous Transactions and the Callback Object(非同期なトランとCallback Obuject)
CallBackオブジェクトと呼ばれるのは、以下のリテラル表現のJavaScriptオブジェクトである。
var callback = { success: function(o) {/*success handler code*/}, failure: function(o) {/*failure handler code*/}, argument: [argument1, argument2, argument3] }
ここで、
success | XMLHttpRequestが正常に処理され、サーバーから正常なレスポンス(Httpサーバーのステータスコードで言えば200系)が戻った際に処理する関数(ハンドラ)を定義 |
failure | サーバーから通信障害のレスポンス(ステータスコードで言えば400系)が戻ったときに処理する関数(ハンドラ)を定義 |
argument | 正常系、異常系のハンドラのための引数を定義。オブジェクト、数値、配列など |
以下のコードは、このサンプルとして挙げられているもの。
//正常系、異常系のハンドラに食わせる引数(配列)の例 var args = ['foo','bar']; var responseSuccess = function(o){ /* oはレスポンスオブジェクトをあらわす。 * ハンドラでは、以下のように、このレスポンスオブジェクトのプロパティー * にアクセスすることで処理を実装する。(意味は後述) * o.tId * o.status * o.statusText * o.getResponseHeader[ ] * o.getAllResponseHeaders * o.responseText * o.responseXML * o.argument */ }; var responseFailure = function(o){ // レスポンスオブジェクト(o)のプロパティーとアクセス方法は // responseSuccess()と同じ。(意味は後述) } var callback = { // 通信に成功したら、ハンドラresponseSuccess()を呼ぶ。 success:responseSuccess, // 通信に失敗したら、ハンドラresponseFailure()を呼ぶ。 failure:responseFailure, argument:args };
HttpサーバーのCachingを避けたいとき
Getメソッドに対するサーバーのキャッシング機構を使いたくないときには、Callback Objectに以下のように定義する。
var callback = { cache:false }
こうすると、Getパラメータにrnd=timestampというのが付加されるようになる。(これで、ことなったリクエストだと、サーバーが反応することを期待する)
でも、副作用があるので注意とのこと(それはそうだ)。
CallBackオブジェクトとファイルアップロード
YAHOO.util.Connect.setFormをつかってファイルアップロードする際には、successとfailureの代わりにuloadハンドラを定義しなくてはならない(以下のサンプル)。
var callback = { upload: function(o) {/*upload handler code*/}, argument: [argument1, argument2, argument3] }