すべてのオブジェクトにOn Click スクリプトを一括適用する方法
はじめに
本記事で紹介する方法は、あらかじめオブジェクトのイベントハンドラに手動でスクリプトを記述しておいて、それを用いてオブジェクトを一括制御する方法です。
これに対して、複数のオブジェクトのイベントハンドラに、自動的に一括して、直接スクリプトを書き込みたい場合は、下記記事を参照してください。
javascriptでOn Update / Click スクリプトを編集する - うしブログ
例1
On Click スクリプトの一括設定 - GeoGebra
左上の赤い長方形をクリックしてから、点や三角形をクリックすると、クリックしたオブジェクトが赤くなります。
左上の青い長方形をクリックしてから、点や三角形をクリックすると、クリックしたオブジェクトが青くなります。
すべての点A,B,C,D,E,F,G,HおよびPolygon[F,G,H]について、それぞれのOn Click ハンドラに、SetColor[<オブジェクト>, "Red"]または SetColor[<オブジェクト>, "Blue"]を記述しても良いのですが、 入力作業が煩雑です。
例2
On Click スクリプトの一括設定2 - GeoGebra
点A,B,C,...Gをクリックすると、クリックした点に、緑色の十字が移動します。
点G,H,Iは例外で、クリックしても何も起こりません。
緑色の十字の定義は、{x=a,y=b}です。
点AのOn Click ハンドラに、
SetValue[a,x(A)]
SetValue[b,y(A)]
を記述し、
点BのOn Click ハンドラに、
SetValue[a,x(B)]
SetValue[b,y(B)]
を記述し、...というように、それぞれの点のハンドラに、逐一スクリプトを記述しても実現できますが、煩雑です。
このように、すべてのオブジェクトに、一括してOn Click ハンドラを設定したい場合には、下記のような方法が有効です。
※以下では、具体例として、例2のアプレットの場合の設定方法を紹介します。
On Click ハンドラの一括設定
前提として、以下のオブジェクトを作成しておきます。
clickedobjname = "usidesu"
クリックされたオブジェクトの名前を格納するためのテキストオブジェクトです。さしあたり、値は任意です。
scriptlist = <テキストのリスト>
実行したいOn Click スクリプトを記述したテキストのリストです。スクリプト内に、クリックしたオブジェクトの名前が出てくる場合は、
"テキスト文字列"+ clickedobjname +"テキスト文字列"
というように記述します。
例2では、以下のように定義します。
scriptlist = {"SetValue[a,x(" + clickedobjname + ")]", "SetValue[b,y(" + clickedobjname + ")]"}
exclist = { Name[<オブジェクト名>], Name[<オブジェクト名>], ... }
例外的に、On Click スクリプトを実行したくないオブジェクトがある場合は、ここに記述します。ない場合は、空のリスト{}として作成してください。
例2では、以下のように定義します。
exclist = {Name[H], Name[I], Name[J]}
そして、「グローバルJavaスクリプト」に、以下のスクリプトを記述します(ここの記述は、scriptlistやexclistの内容にかかわらず、共通です)。
function ggbOnInit() {
ggbApplet.registerClickListener("runClickScript");
}function runClickScript(name){
ggbApplet.setTextValue("clickedobjname",name);
ggbApplet.evalCommand("If[¬(clickedobjname∈exclist),Execute[scriptlist]]");
}
設定は以上です。設定が有効となるのは、アプレットを再起動した後です。
関連記事