cancel技…Indesignの挙動を変える2

連休おわっちゃいましたねえ、気温もぐんぐん上昇中です。しかし、仕事の方はもうしばらく多忙な状態が続くようです。まあ、ありがたい話なのですが。
このところeventListenerに凝っていたりします。うまく実装するとトンデモナイ挙動をします。正直役に立たないものも多いのですが面白いです。
そんなこんなで今回もeventListener絡みでいきます。

まずはomvからの引用です

BEFORE_INVOKE string readonly Dispatched before the Event is invoked. This event does not bubble. This event is cancelable. (default: beforeInvoke)

beforeInvokeの項目の抜粋です。ご覧の様にcancelableです。beforeInvokeに限らず事前に捕まえるbefore〜に関しては全てがcancelableです。
続いてmethodsをチェックしてみましょう。

Methods
Instances
Array of Event getElements ()
Resolves the object specifier, creating an array of object references.

void preventDefault ()
Cancels the default behavior of the event on its target.

void stopPropagation ()
Stops propagation of the event beyond the current target.

string toSource ()
Generates a string which, if executed, will return the Event.

string toSpecifier ()
Retrieves the object specifier.

eventの伝達を阻止するstopPropagation()と、デフォルトの挙動をキャンセルするpreventDefault()というメソッドが用意されていますね。組み合わせて使えば良いのですが、今回の「beforeInvoke」は「not Bubble」。ですので伝達を止める必要はありません。

今回は例として「カット」を止めてみます。

#targetengine ‘session’

var m = app.menuActions.item(“$ID/Cut”);
var myEv = m.eventListeners.add(“beforeInvoke”, evTweak);
myEv.name = “testEvent”;

function evTweak(ev){
    alert (“You can’t cut any data. (^-^;)…”);
    ev.preventDefault();
    }

eventListenerを利用して処理を横取りするのでその設定から。
メニューアクションに対してイベントリスナを設定します。
肝心な部分はハンドラ

function evTweak(ev){
    alert (“You can’t cut any data. (^-^;)…”);
    ev.preventDefault();
    }

alert部分で通常の処理を行った後、preventDefault()メソッドを実行すると良いです。
メニュー項目が選択されるとイベントが発生してalertが実行された後、正規の処理がキャンセルされます。

イベントリスナの削除は下の一行を実行して下さい。

app.menuActions.item(“$ID/Cut”).eventListeners.item(“testEvent”).remove();

しかしながら、こんな事しているとどの挙動が本来のものなのか分からなくなったりしますのでご注意を。
わたしのIndesignでは10本程度のリスナが常駐していたりします。他のマシンをいじる時に戸惑ったりする事もしばしば(^^;)

ten_a

Graphic Designer, Scripter and Coder. Adobe Community Professional.

シェアする