Table of Contents

EventPerk

継承:Perk セクション名:event 優先度:210

概要

EventPerkはイベントハンドラの追加やイベントのトリガーなど、イベント関連の機能を付与します。

設定

書式-ユニット固有設定

各ユニット固有の設定は“event”セクションに記述します。

{
    "event": {
        "events": {
            <elementName>: {
                "handlers": {
                    <eventName>: { または [{
                        "handler": Function|String,
                        "listerOptions": Object,
                        "options": Object,
                        "order": Number,
                    } または }, ...]
                    ...
                },
                "rootNode": String,
            },
            ...
        }
    }
}

イベントハンドラの設定には短縮系があります。イベントハンドラにオプションが不要な場合は、こちらを使用できます。

{
    "event": {
        "events": {
            <elementName>: {
                "handlers": {
                    <eventName>: Function|String または [Function|String, ...],
                    ...
                },
                "rootNode": String,
            },
            ...
        }
    }
}

<elementName>

型:String

要素名を指定します。rootNodeオプションを指定しない場合、この値を要素のIDとみなします。この値が“this”の場合ユニット自身を表します。rootNodeオプションに指定がある場合は、この値は特に意味は持ちません(ただし一意な値にしてください)。


<eventName>

型:String

イベントハンドラを登録したいイベント名を指定します。有効なイベント名はBitsmistJSイベント、もしくはJavascriptの標準のイベントです。


"handler"

型:String|Function

このイベントに対するイベントハンドラを指定します。イベントハンドラは文字列またはFunctionオブジェクトを指定します。文字列を指定した場合は、ユニットのメソッド名と判断されます。この場合、ユニットのメソッドの中から同名の関数がセットされます。Functionオブジェクトを指定した場合はイベントハンドラそのもの(Functionオブジェクト)と判断されます。いずれの場合もハンドラはユニットにbindされ、“this”はユニット自身を指すようになります(addスキルの引数で指定されてない場合)。


"listenerOptions"

型:Object

JavascriptネイティブのaddEventListener()関数に渡すオプションを指定します。


"options"

型:Object

イベントハンドラに渡すオプションのオブジェクトを指定します。イベントハンドラの引数“ex”からアクセスできます。


"order"

型:Number Default:0

同じ要素の同じイベントに、複数のイベントハンドラがある場合の実行順を制御します。数値が高いほど先に実行されます。指定がない場合は0です。


"rootNode"

型:String

イベントハンドラをセットする対象の要素のノードを表す、セレクター文字列です。自身の配下の要素のみが対応となります。複数の要素が該当する場合、全ての要素に対して同じイベントハンドラがセットされます。

設定例

ここでは様々な設定例を紹介します。省略形が使える場合は、省略形で記述しています。

要素の指定方法

どの要素に対してなのかを指定する例を紹介します。大きく分けると、ユニット自身なのか、ユニット内部の要素なのか、に別れます。

ユニット自身

"event": {
    "events": {
        "this": {
            "handlers": {
                "doRefresh": this.onDoRefresh
            }
        }
    }
}

<elementName>が“this”なので、ユニット自身に対してセットします。

“rootNode”に指定することもできます。その場合<elementName>“myself”は、特に意味を持ちません。

"event": {
    "events": {
        "myself": {
            "rootNode": "this"
            "handlers": {
                "doRefresh": this.onDoRefresh
            }
        }
    }
}

ユニット内の要素

要素を指定する場合、要素がIDを持っていれば<elementName>にそれを指定することができます。

"event": {
    "events": {
        "btn-menu": {
            "handlers": {
                "click": this.onBtnMenu_Click
            }
        }
    }
}

上記の場合、btn-menuというIDを持つ要素に、イベントハンドラがセットされます。

“rootNode”に指定する場合、querySelectorAll()に指定可能な文字列を使用できます。

"event": {
    "events": {
        "btn-menu": {
            "rootNode": ".buttons"
            "handlers": {
                "click": this.onBtnMenu_Click
            }
        }
    }
}

その結果、複数の要素になっても構いません。全ての要素に同じイベントハンドラがセットされます。この場合も、<elementName>“btn-menu”は、特に意味を持ちません。

ハンドラの指定方法

次にイベントハンドラの指定方法の例を示します。

関数オブジェクトと文字列

イベントハンドラとして、関数オブジェクトか文字列を指定することができます。

"event": {
    "events": {
        "this": {
            "handlers": {
                "doRefresh": this.onDoRefresh
            }
        }
    }
}

“doRefresh”イベントに対して、Functionオブジェクトを指定しています。

"event": {
    "events": {
        "this": {
            "handlers": {
                "doRefresh": "onDoRefresh"
            }
        }
    }
}

この例では、“doRefresh”イベントに対して、文字列を指定しています。この場合はこのユニットのメソッドの中から同名の関数がセットされます。つまりthis.onDoRefresh()メソッドがセットされます。

Functionオブジェクトを指定する場合は、設定の時点でそのFunctionオブジェクトが存在する必要があります。対して文字列の場合はイベントハンドラを実行する時に存在する必要があります。

複数のイベントハンドラ

一つのイベントに対して、複数のイベントハンドラを指定することができます。

"event": {
    "events": {
        "this": {
            "handlers": {
                "doRefresh": ["onDoRefresh1", this.onDoRefresh2]
            }
        }
    }
}

配列を使用することで、1つのイベントに2つのイベントハンドラを指定しています。文字列とFunctionオブジェクトを組み合わせても構いません。

オプションを指定する

イベントハンドラにオプションを指定することができます。

一つのハンドラにオプションを指定する

"event": {
    "events": {
        "this": {
            "handlers": {
                "doRefresh": {
                    "handler": this.onDoRefresh,
                    "options": {"value":"1"}
                 }
            }
        }
    }
}

この例ではイベントハンドラと同時にオプションも指定しています。このオプションは以下のように、イベントハンドラのexパラメータからアクセス可能です。

onDoRefresh(sender, e, ex)
{
    console.log("value =", ex.value); // console displays "value = 1"
}

複数のハンドラにオプションを指定する

次の例では、複数のハンドラを指定しています。それぞれのハンドラに別のオプションを渡しています。

"event": {
    "events": {
        "this": {
            "handlers": {
                "doRefresh": [
                    {
                        "handler": this.onDoRefresh1,
                        "options": {"value":"1"}
                     },
                    {
                        "handler": "onDoRefresh2",
                        "options": {"value":"2"}
                     },
                 ]
            }
        }
    }
}

イベントハンドラ

doApplySettings

“event.events”セクションから設定を読み込み、イベントハンドラを追加します。

参照する設定


afterTransform

“event.events”セクションから設定を読み込み、ユニット内の各要素に対するイベントハンドラのみをセットされます。ユニット自身のイベントは、このタイミングではインストールされません。

参照する設定

スキル

add

型:Undefined 対象:Unit

引数で指定されたHTML要素に対し、指定されたイベントのイベントハンドラをセットします。

パラメータ

パラメータ説明
eventName
必須
Stringイベント名です。
handlerInfo
必須
Objectイベントハンドラ情報です。これは設定の<eventName>に対してセットする値と同じものです。
element
デフォルト:this
HTMLElementイベントハンドラをセットするHTML要素です。指定がない場合は、ユニット自身となります。
bindTo
デフォルト:this
Objectイベントハンドラをこのオブジェクトにbindします。つまり、この引数がハンドラ内でthisとなります。指定がない場合はユニット自身にbindされます。

戻り値

なし。


init

型:Undefined 対象:Unit

引数で指定された名前の要素に対し、イベントハンドラを設定します。addスキルと違い、複数のイベントに対してイベントハンドラを一度にセットすることも可能です。それぞれのイベントに対し、addスキルを使用してセットします。

パラメータ

パラメータ説明
elementName
必須
Object要素名を指定します。設定のelementNameの説明も参照してください。
eventInfoObjectイベント情報を格納したオブジェクトを指定します。設定の<elementName>に対してセットする値と同じです。指定がない場合は、設定の“events”セクションからelementName引数に指定された値を取得して使用します。
rootNode
デフォルト:this
String要素の検索対象となるルートノードを指定します。指定がない場合はユニット自身になります。

戻り値

なし。

参照する設定


remove

型:Undefined 対象:Unit

HTML要素からイベントハンドラを取り除きます。

パラメータ

パラメータ説明
eventName
必須
Stringイベント名です。
handlerInfo
必須
Objectイベントハンドラ情報です。これは設定の<eventName>に対してセットする値と同じものです。
element
デフォルト:this
HTMLElementイベントハンドラを取り除くHTML要素です。指定がない場合は、ユニット自身となります。

戻り値

なし。


reset

型:Undefined 対象:Unit

引数で指定された名前の要素に対し、設定に従ってイベントハンドラを除去します。initスキルの逆の処理を行います。

パラメータ

パラメータ説明
elementName
必須
Object要素名を指定します。設定のelementNameの説明も参照してください。
eventInfoObjectイベント情報を格納したオブジェクトを指定します。設定の<elementName>の値です。指定がない場合は、設定の“events”セクションからelementName引数に指定された値を取得して使用します。
rootNode
デフォルト:this
String要素の検索対象となるルートノードを指定します。指定がない場合はユニット自身になります。

戻り値

なし。

参照する設定


triggerSync

型:Undefined 対象:Unit

イベントを発生させますが、triggerと違い、一つ前のハンドラの終了を待たずに次のハンドラを呼び出します。その他の説明に関してはtriggerを参照してください。

スペル

trigger

型:Undefined 対象:Unit

イベントを発生させます。同じ要素の同じイベントに複数のイベントハンドラがセットされている場合、前のイベントハンドラの実行が完了してから、次のイベントハンドラを呼び出します。

前のイベントハンドラがPromiseを返し、正しいタイミングでresolve/rejectしている場合のみ、次のイベントハンドラが待つことができます。

パラメータ

パラメータ説明
eventName
必須
String発生させるイベント名です。
optionsObjectイベントの詳細情報です。イベントハンドラからe.detailでアクセスできます。
element
デフォルト:this
HTMLElementイベントを発生させる要素です。指定がない場合は、ユニット自身となります。

戻り値

なし。