Abstract.EventObserverクラス
【抜粋】一部省略 Abstract.EventObserver = function() {} Abstract.EventObserver.prototype = { initialize: function(element, callback) { (省略) }, (省略) registerCallback: function(element) { (省略) } }
名前の通り抽象クラスです。継承することで、入力要素におけるonClickまたはonChangedイベント時に、指定した関数を実行させるサブクラスを作成することができます。具体的には以下。
タグ | type | イベント |
---|---|---|
input | checkbox radio |
onClick |
input | password text |
onChange |
textarea select |
- | onChange |
サブクラスでは、監視する値を返却するgetValueメソッドを実装する必要があります。
後述Form.Element.EventObserverクラス、Form.EventObserverクラスで継承しています。プログラマがサブクラスを作ることもできますが、Abstract.TimedObserverクラスとは違い、機能がかなり限定的なこともあり、その機会はあまりない気がします。なので、例はここでは提示しません(Form.EventObserverクラスを参照してください)。
initializeメソッド
【抜粋】 initialize: function(element, callback) { this.element = $(element); this.callback = callback; this.lastValue = this.getValue(); if (this.element.tagName.toLowerCase() == 'form') this.registerFormCallbacks(); else this.registerCallback(this.element); },
引数elementは監視する要素(ID指定可)、引数callbackは監視する値が変化した際に実行する関数が指定されます。callback関数には実行時に監視要素と現在値が引数として渡されます。
監視対象の現在値を、サブクラスで実装するgetValueメソッドで取得して、lastValueプロパティに格納するのはAbstract.TimedObserverクラスと同じです。
その後、監視対象がformであればregisterFormCallbacksメソッドを、form以外であればregisterCallbackメソッドを呼び出しています。
onElementEventメソッド
【抜粋】 onElementEvent: function() { var value = this.getValue(); if (this.lastValue != value) { this.callback(this.element, value); this.lastValue = value; } },
Abstract.TimedObserver.onTimerEventメソッドと同じ。監視対象の現在値を、サブクラスで実装するgetValueメソッドで取得して、lastValueプロパティと比較します。変化があったら、callbackプロパティに登録された関数を、elementプロパティと現在値を引数にして呼び出します。その後、lastValueプロパティに現在値を格納します。
前述したように、このままだと値が配列の場合に不具合が発生するのですが、現実的にはまず問題になりません。selectタグのイベントがonchageのためです^^; いちおう、改修案は「Abstract.TimedObserver.onTimerEventメソッド改修検討 - Backstage of theater.js」を参照してください。
registerFormCallbacksメソッド
【抜粋】 registerFormCallbacks: function() { var elements = Form.getElements(this.element); for (var i = 0; i < elements.length; i++) this.registerCallback(elements[i]); },
前述initializeメソッドで、監視対象がformの場合に呼び出されるメソッド。対象formの入力要素すべてを次のregisterCallbackメソッドで処理しています。
registerCallbackメソッド
【抜粋】 registerCallback: function(element) { if (element.type) { switch (element.type.toLowerCase()) { case 'checkbox': case 'radio': Event.observe(element, 'click', this.onElementEvent.bind(this)); break; case 'password': case 'text': case 'textarea': case 'select-one': case 'select-multiple': Event.observe(element, 'change', this.onElementEvent.bind(this)); break; } } }
後述Event.observeメソッドは、要素のイベントに関数を登録するメソッドです。これにより引数の要素のonClickまたはonChangeイベントにonElementEventメソッドを登録しています。要素のtypeプロパティにより、登録先のイベントを振り分けています。