Ajax.Baseクラス

【抜粋】一部省略
Ajax.Base = function() {};
Ajax.Base.prototype = {
  setOptions: function(options) {
    this.options = {
      method:       'post',
      asynchronous: true,
      parameters:   ''
    }
    Object.extend(this.options, options || {});
  },
(省略)
  responseIsFailure: function() {
    return !this.responseIsSuccess();
  }
}

後述のAjax.Request、Ajax.Updater、Ajax.PeriodicalUpdaterで継承されます。抽象クラス扱いで、プログラマインスタンスを作成することはありません。

ここで、ちょっと分からないことが。今までは抽象クラスの実装は以下のようにしていました。

【参考】Enumerableクラスの継承
var Enumerable = {
(省略)
}
(省略)
ObjectRange = Class.create();
Object.extend(ObjectRange.prototype, Enumerable);
Object.extend(ObjectRange.prototype, {
(省略)
}

抽象クラス扱いのEnumerableクラスは、Class.createメソッドとprototypeプロパティを使用せず、varで宣言してオブジェクトへ直にメソッドを定義しています。その後、Object.extendメソッドを使用して継承を実現しています。

しかし、Ajax.Baseクラスを継承する場合は以下のようになっています。

【参考】Ajax.Baseクラスの継承
Ajax.Base = function() {};
Ajax.Base.prototype = {
(省略)
}
(省略)
Ajax.Request = Class.create();
(省略)
Ajax.Request.prototype = Object.extend(new Ajax.Base(), {
(省略)
}

抽象クラス扱いのAjax.Baseは、Class.createは使用しないものの、空のfunctionが設定されています。そして、そのprototypeプロパティにメンバが追加されています。その後、Object.extendを使用して、Ajax.Baseのインスタンスにメンバを追加し、これをAjax.Requestクラスのprototypeプロパティに設定しています。

この二者は結果として同じになると思います。なぜ書き方が違うのかは分かりません・・・。継承の実装方法としては、前者の方が感覚的に分かりやすいと思うのですが。後者はトリッキーな気がします。あとで理由がで分かったら追記します。

setOptionsメソッド

【抜粋】
  setOptions: function(options) {
    this.options = {
      method:       'post',
      asynchronous: true,
      parameters:   ''
    }
    Object.extend(this.options, options || {});
  },

外部から呼ばれることはなく、Ajax.Baseクラスを継承する各Ajaxクラスのインスタンス生成時に呼び出されるメソッドです。

自オブジェクトoptionsプロパティにオブジェクトを定義し、引数のオブジェクトoptionsのプロパティをそれに追加しています。引数optionsがnullなら空オブジェクトを使用しています。

optionsプロパティのオブジェクトにはmethod(='post')、asynchronous(=true)、parameters(='')がデフォルトで設定されますが、他にも設定できます。設定できるプロパティは以下を参照してください。

prototype.js v1.4.0 の使い方 - options 引数オブジェクト

補足として、onXXXXXXXXとなっている部分に該当するプロパティは以下になります。(Ajax.Respondersで設定できるものとは若干違います)

プロパティ名 イベント発生時期
onLoading インスタンス生成の0.01秒後
onLoaded データ送信時(ローカルでは発生しない)
onInteractive データ受信開始時
onComplete 通信完了時(エラー時も含む)
on(+HTTPステータスコード) 通信完了時のHTTPステータスコードに対応
onSuccess 通信成功時(HTTPステータスコード2xx) ステータスコード指定優先
onFailure 通信失敗時(HTTPステータスコード2xx以外) ステータスコード指定優先
onException 例外発生時

HTTPステータスコードについては以下を参照してください。

http://homepage1.nifty.com/yito/anhttpd/statuscode.html
【例】
<html>
<head>
<title></title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<script language="javascript" src="prototype.js" charset="utf-8"></script>
<script language="javascript">
<!--
function test(){
  new Ajax.Request(
    'test.jsp',
	 
    //以降がsetOptionsの引数となる
    { method:'post',
      asynchronous:true,
      postBody:"txt1=" + $('txt1').value + "&txt2=" + $('txt2').value,
      requestHeaders:['headerName1', 'headerValue1',
                      'headerName2', 'headerValue2'],
      on200:function(req){//200はOK(受信完了)を意味する
        $('test').innerHTML = req.responseText;
      }
    });
}
//-->
</script>
</head>
<body>
<div id="test"></div>
<input type="text" id="txt1" value="あいうえお"/><br/>
<input type="text" id="txt2" value="かきくけこ"/><br/>
<button onclick="test();">TEST</button>
</body>
</html>
----------------------------------------------------------
[test.jsp]
<%@ page contentType="text/plain;charset=utf-8" %>
<%@ page import="java.util.*, java.io.*" %>
<%!
//2バイト文字Unicode変換
public String strEncode(String strVal)
  throws UnsupportedEncodingException{
  if(strVal == null){
    return ( null);
  }else{
    return (new String(strVal.getBytes("ISO-8859-1"), "UTF-8"));
  }
}
%>
<%
//キャッシュ無効化
Calendar today = new GregorianCalendar();
response.setDateHeader("Last-Modified", today.getTime().getTime());
response.setDateHeader("Expires", 0);
response.setHeader("Pragma","no-cache");
response.setHeader("Cache-Control","no-cache");
%>
txt1:<%=strEncode(request.getParameter("txt1"))%><br/>
txt2:<%=strEncode(request.getParameter("txt2"))%><br/>
header1:<%=request.getHeader("headerName1")%><br/>
header2:<%=request.getHeader("headerName2")%><br/>

responseIsSuccessメソッド

【抜粋】
  responseIsSuccess: function() {
    return this.transport.status == undefined
        || this.transport.status == 0
        || (this.transport.status >= 200 && this.transport.status < 300);
  },

this.transportはその通信で使用するXMLHttpRequestオブジェクトです。そのHTTPステータスコードを判定し、undefinedか0か200番台であればtrue、そうでなければfalseを返却します。

responseIsFailureメソッド

【抜粋】
  responseIsFailure: function() {
    return !this.responseIsSuccess();
  }

上記responseIsSuccessメソッドの逆の結果を返却します。