Flash:ADDED_TO_STAGEイベントが2回発生する
2012/08/31
category: Flash | tag: ActionScript, Event, Flash | no comments
親子関係がある場合、親のADDED_TO_STAGEイベントリスナー内で子をaddChildすると、子のADDED_TO_STAGEイベントが2度発生する。
見事にはまりました。よく知られた現象のようです。
ADDED_TO_STAGEイベントが2度もいらない場合(おそらく殆どの場合)は、イベントリスナーの中でリスナーを削除するようにしましょう。イベントのハンドリングでは、意図しないイベントを拾ってしまわないように注意する必要がありそうです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
package { import flash.display.MovieClip; import flash.events.Event; public class EventTest extends MovieClip { var _mc:MovieClip; public function EventTest() { addEventListener(Event.ADDED_TO_STAGE, onAddedToStage); } function onAddedToStage(e:Event):void { trace('EventTest:onAddedToStage'); _mc = new MC1(); addChild(_mc); } } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
package { import flash.display.MovieClip; import flash.events.Event; public class MC1 extends MovieClip { var _mc:MovieClip; public function MC1() { addEventListener(Event.ADDED_TO_STAGE, onAddedToStage); } function onAddedToStage(e:Event):void { trace('MC1:onAddedToStage'); _mc = new MC2(); addChild(_mc); } } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
package { import flash.display.MovieClip; import flash.events.Event; public class MC2 extends MovieClip { var _mc:MovieClip; public function MC2() { addEventListener(Event.ADDED_TO_STAGE, onAddedToStage); } function onAddedToStage(e:Event):void { trace('MC2:onAddedToStage'); } } } |
出力ウィンドウには、以下のように表示されます。
EventTest:onAddedToStage
MC1:onAddedToStage
MC2:onAddedToStage
MC2:onAddedToStage
MC2:onAddedToStageが2回表示されています。
MC2.asのイベントリスナー(onAddedToStage)でリスナーを削除するように修正します。
1 2 3 4 5 |
function onAddedToStage(e:Event):void { removeEventListener(Event.ADDED_TO_STAGE, onAddedToStage); trace('MC2:onAddedToStage'); } |
出力ウィンドウの内容は、以下のように変わりました。
EventTest:onAddedToStage
MC1:onAddedToStage
MC2:onAddedToStage
コメントを残す
コメントを投稿するにはログインしてください。