EaselJSのDisplayObject.mouseEnabledプロパティで直後のDisplayObject.mouseoutイベントが止められない [Edit]

EaselJSのDisplayObject.mouseEnabledプロパティで直後のマウスイベントが止められない」ことがあります。この問題について、CreateJS Supportから回答がありました。その中身についてご説明します。

DisplayObject.mouseEnabledプロパティをfalseに定めると、マウス操作のイベントがそのオブジェクトからは起こらなくなります。ところが、その後マウスポインタを動かすと、DisplayObject.mouseoutイベントが1度だけ生じてしまうのです。

もっとも、DisplayObject.mouseEnabledプロパティをfalseにしたとき、オブジェクトの上にあったマウスポインタがもはやインタラクションを失ったオブジェクトから外れたことにする、という仕様でしたら理屈はつきます。実際、Flashではプロパティをfalseにした瞬間、DisplayObject.mouseoutイベントが起こります。

EaselJSもこの仕様に則りつつ、最適化のためにマウスを動かすまでイベントが送られないようにしたとのことです。仕様と最適化の考慮は、それぞれは納得できます。けれど、ふたつを合わせた現在のふるまいは、意図しない結果に思えます。

もともと、マウスポインタとオブジェクトの重なりを調べることそのものが負荷をかけるため、Stage.enableMouseOver()メソッドを呼出さないとDisplayObject.mouseoutイベントは送れませんでした。そこで示されたCreateJS Supportからのアイデアは、このメソッドに引数をもうひとつ加えて、マウスを動かさなくてもイベントを起こすようにするというものです。負荷をわかったうえでユーザーが選べるのは、望ましいことではないでしょうか。

myStage.enableMouseOver(frequency, alwaysCheck);

その他の記事