ウィジェットのイベント処理
ウィジェットには固有のイベントが定義されていて、ウィジェットが特定の状態(ボタンが押された、ペインが開いた等)になったとき呼び出されます。 どのようなイベントが定義されているのかはAPIドキュメントに記述されています。 たとえばdijit.form.Buttonウィジェットの場合はonClick, onMouseDown, onShowなどが定義されています。
あるイベントが発生したときに処理を行いたい場合、イベント・ハンドラーの書き方にはいくつかの方法があります。
拡張scriptタグによる静的記述
前節の静的な手法でHTML内にウィジェットを配置したとき、ウィジェット定義の内部に次のように<script>タグを記述することができます。 type属性には"dojo/connect"または"dojo/method"を指定し、event属性には対象にするイベントを指定します。
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>ウィジェットへのイベント・ハンドラーの記述</title> <style> @import url("../dojo-release-1.5.0/dojo/resources/dojo.css"); @import url("../dojo-release-1.5.0/dijit/themes/claro/claro.css"); </style> <script type="text/javascript" src="../dojo-release-1.5.0/dojo/dojo.js" djConfig="parseOnLoad: true"></script> <script type="text/javascript"> dojo.require("dojo.parser"); // DojoがHTMLをパースするのに必要 dojo.require("dijit.form.Button"); </script> </head> <body class="claro"> <div id="button1" dojoType="dijit.form.Button">dojo/connect <script type="dojo/connect" event="onClick"> // type="dojo/connect"の場合、ウィジェットのイベントを表すメソッドにdojo.connect()で処理を追加するのと等価 alert('Clicked!'); </script> </div> <div id="button2" dojoType="dijit.form.Button">dojo/method <script type="dojo/method" event="onClick"> // type="dojo/method"の場合、ウィジェットのイベントを表すメソッドを置き換える (関数を代入するのと等価) alert('Clicked!'); </script> </div> </body> </html>
処理内容が簡潔な場合に利用するとよいでしょう。
イベント・ハンドラーへの代入またはdojo.connect()
直前の例と同等なイベント処理をJavaScriptコードからセットする場合、次のように書くことができます。
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>ウィジェットのイベント・ハンドラーの記述(2)</title> <style> @import url("../dojo-release-1.5.0/dojo/resources/dojo.css"); @import url("../dojo-release-1.5.0/dijit/themes/claro/claro.css"); </style> <script type="text/javascript" src="../dojo-release-1.5.0/dojo/dojo.js" djConfig="parseOnLoad: true"></script> <script type="text/javascript"> dojo.require("dojo.parse"); // DojoがHTMLをパースするのに必要 dojo.require("dijit.form.Button"); function onButtonClick(event) { alert("Clicked!"); } var handler = null; dojo.addOnLoad(function() { handler = dojo.connect(dijit.byId("button1"), "onClick", window, "onButtonClick"); }); dojo.addOnUnload(function(){ dojo.disconnect(handler); }); </script> </head> <body class="claro"> <div id="button1" dojoType="dijit.form.Button">dojo.connect()</div> <div id="button2" dojoType="dijit.form.Button" onClick="onButtonClick">イベント・ハンドラーの代入</div> <!-- コード中で dijit.byId("button2").onClick = onButtonClick; としてもよい --> </body> </html>
コードからウィジェットのイベント・ハンドラーをセットする場合、セットするタイミングや処理内容を柔軟に変えることができます。