Behavior スクリプト コンポーネントのカスタム イベントの公開
Behavior スクリプト コンポーネントでは、オートメーション スクリプト コンポーネントと同じように、スクリプト コンポーネントの内側で発生するカスタム イベントを公開することができます。また、Behavior スクリプト コンポーネントをドキュメント内で処理することもできます。イベントは、次のように <public> 要素で宣言されます。
<public>
<event name="onResultChange" />
</public>
イベントは、スクリプト内の fireEvent メソッドを呼び出すことによって発生します。
<script language="JScript">
// ここにほかのコードを記述します。
fireEvent("onResultChange");
// ここにほかのコードを記述します。
</script>
ビヘイビアでは、要素で既に定義されている同じ名前のイベントを公開することで、要素の既定のビヘイビアを定義し直すことができます。たとえば、onclick イベントを公開するビヘイビアでは、要素の既定の onclick イベントを定義し直すことができます。
カスタム イベントの情報を取得または設定する
スクリプト コンポーネントのカスタム イベントは、イベント固有の情報を保持している DHTML event オブジェクトにアクセスできます。このオブジェクトは、次の目的に使用できます。
- イベントを呼び出したときに設定された既存の event オブジェクトのプロパティ (keyCode など) を変更する。
- イベントにイベント情報を戻すために、event オブジェクトの新しいプロパティ (expando) を作成する。
スクリプト コンポーネントのコードで、event オブジェクトの新しいインスタンスを作成するために createEventObject メソッドを呼び出し、新しい event オブジェクトに 1 つ以上のプロパティを設定します。fireEvent メソッドを呼び出した場合は、イベント名と共に新しい event オブジェクトを渡すことができます。
新しい expando プロパティは、スクリプト内でプロパティの値を代入する際に、名前を付けるだけで作成できます。次のコードは、event オブジェクトに myprop という新しいプロパティを作成する例です。
oEvent = createEventObject();
oEvent.myprop = "a new value"
メモ expando プロパティを作成できるのは、Microsoft® JScript® (または JavaScript) を使用する場合だけです。この機能は、Microsoft® Visual Basic® Scripting Edition (VBScript) ではサポートされていません。
例
次のコードは、計算機のスクリプト コンポーネントからの抜粋です。この例では、onResultChange というカスタム イベントを定義します。このイベントは、計算結果が変更されると常にドキュメントに対して発生します。イベント固有の情報 (実際の計算結果) は、result という expando プロパティをとおして渡されます。
メモ <script> 要素内のスクリプトを隠蔽するには、CDATA セクションが必要です。詳細については、「スクリプト コンポーネント ファイルと XML 適合性」を参照してください。
<public>
<event name="onResultChange" />
</public>
<implements type="Behavior">
<attach event="onclick" handler="doCalc"/>
</implements>
<script language="JScript">
<![CDATA[
function doCalc()
{
// ここに計算を実行するコードを記述します。
// その結果は、変数 sResult に代入します。
oEvent = createEventObject();
oEvent.result = sResult;
fireEvent("onResultChange",oEvent);
}
]]>
</script>
次のコードは、ページの表示内容を示します。onResultChange イベントを発生させると、DHTML window.event オブジェクトの expando プロパティの result
から計算結果が抽出され、resultWindow <DIV> 要素に表示されます。
<HTML>
<HEAD>
<xml:namespace prefix="LK" />
<style>
LK\:CALC {behavior:url(calc.wsc)}
</style>
<script language="JScript">
function showResults(){
resultWindow.innerText=window.event.result;
}
</script>
</HEAD>
<LK:CALC id="myCalc" onResultChange="showResults()">
<TABLE>
<TR>
<DIV ID=resultWindow
STYLE="border:'.025cm solid gray'"
ALIGN=RIGHT>0.</DIV>
</TR>
<TR>
<TD><INPUT TYPE=BUTTON VALUE=" 0 "></TD>
<TD><INPUT TYPE=BUTTON VALUE="+/-"></TD>
<TD><INPUT TYPE=BUTTON VALUE=" . "></TD>
<TD><INPUT TYPE=BUTTON VALUE=" + "></TD>
<TD><INPUT TYPE=BUTTON VALUE=" = "></TD>
<TR>
</TABLE>
</LK:CALC>
</HTML>