Form.EventObserverクラス

【抜粋】
Form.EventObserver = Class.create();
Form.EventObserver.prototype = Object.extend(new Abstract.EventObserver(), {
  getValue: function() {
    return Form.serialize(this.element);
  }
});

前述Abstract.EventObserverクラスを継承しています。指定フォームがもつ入力要素すべてのイベント発生時(onClickまたはonChange)、フォームの入力内容に変化があった場合に、指定関数を実行させるためのクラスです。

getValueメソッド

前述Abstract.EventObserverクラスを継承する場合に必要なメソッド。対象フォーム(elementプロパティ)がもつ入力要素すべての値を、前述Form.serializeメソッドにより文字列として取得し、返却しています。

【例】
<html>
<head>
<title></title>
<script language="javascript" src="prototype.js" charset="utf-8"></script>
<script>
function init(){
  new Form.Element.EventObserver(document.FORMNAME.TEXT, func1);
  new Form.Element.EventObserver(document.FORMNAME.CHECK, func1);
  new Form.Element.EventObserver(document.FORMNAME.SELECT, func1);
  new Form.EventObserver(document.FORMNAME, func2);
}
function func1(element, value){
  Element.update('test1', element.name + " cahnged to " + value);
}
function func2(element, value){
  Element.update('test2', element.name + " cahnged to " + value);
}
</script>
</head>
<body onload="init();">
<form name="FORMNAME" onsubmit="return false;">
<input type="text" name="TEXT" value="テキストボックス"/>
<input type="checkbox" name="CHECK" value="CHEKED" checked/>
<select size="3" name="SELECT" multiple>
  <option value="OPTION1">オプション1</option>
  <option value="OPTION2">オプション2</option>
  <option value="OPTION3" selected>オプション3</option>
  <option value="OPTION4">オプション4</option>
</select>
</form>
<div id="test1">element</div>
<div id="test2">form</div>
</body>
</html>

入力要素の内容を変更すると、表示メッセージが変わります。

注意点として、テキストボックス等のテキスト入力要素は、カーソルが要素から外れるまでonChangeイベントを発生させません。入力をリアルタイムに監視したい場合は、前述Form.Element.Observer、Form.Observerクラスを使うか、Abstract.EventObserverクラスのregisterCallbackメソッドを改造する必要があります*1

selectタグにmultiple指定をしても、(コード上問題があっても)特に問題が起こらないのは前述したとおりです。

複数の同名要素を監視するのは更に工夫が必要なため、ここでは触れてません^^; 整理できたら追記しようと思います。

*1:onCahngeイベント以外に、onKeyup等を追加する。詳細は省略^^;