[AS3] 이벤트 흐름
Flash - as2, as3 2010. 2. 4. 14:14http://help.adobe.com/ko_KR/ActionScript/3.0_ProgrammingAS3/WS5b3ccc516d4fbf351e63e3d118a9b90204-7e4f.html
이벤트는 개념적으로 세 단계로 구분이 되는데, 각각 캡쳐, 타겟, 버블링 단계로 구분된다.
| capture 단계 |
stage 에서 대상 노드의 부모까지의 모든 노드를 포함 |
| target 단계 | 이벤트가 최종적으로 도달하는 대상(target)노드만 포함 |
| bubbling 단계 | 대상노드의 부모에서 stage 로 돌아오면서 거치는 모든 노드를 포함 |
stage 가 가장 상위에 있는 상하구조로 보면 쉽다.
위 그림에서 Child1 Node 에 이벤트가 전달된다고 가정할 경우
capture 단계에 해당되는 노드는 Stage, Parent Node
target 단계에 해당되는 노드는 Child1 Node
bubbling 단계에 해당되는 노드는 Parent Node, Stage
가 된다.
package
{
import flash.display.Sprite;
import flash.events.MouseEvent;
public class Main extends Sprite
{
public function Main():void
{
var mov1:mov_1 = new mov_1();
var mov2:mov_2 = new mov_2();
addChild( mov1 );
mov1.addChild( mov2 );
// addEventListener 의 세번째 파라메터값이 true 일 경우, 캡쳐 단계에서만 동작.
mov1.addEventListener( MouseEvent.CLICK, fn1 );
mov2.addEventListener( MouseEvent.CLICK, fn2 );
stage.addEventListener( MouseEvent.CLICK, fnStage );
}
private function fn1( e:MouseEvent ):void
{
trace( "mov1" );
}
private function fn2( e:MouseEvent ):void
{
trace( "mov2" );
}
private function fnStage( e:MouseEvent ):void
{
trace( "stage" );
}
}
}
위 소스코드로 살펴보면
마우스이벤트는 기본적으로 bubble이 true 로 선택되어 있기 때문에
mov2 를 선택했을 경우 출력결과는
// mov2
// mov1
// stage
대상(target) 노드인 mov2 부터 mov2, mov1, stage 순으로 이벤트의 흐름이 일어난다.
addEventListener 의 세번째 인자인 userCapture(기본값은 false) 를 true 로 설정하면
mov1.addEventListener( MouseEvent.CLICK, fn1, true );
capture 단계에 mov1 의 동작이 일어난 후에 순차적으로 이벤트가 흘러가게되는데
출력결과는
// mov1
// mov2
// stage
순으로 일어나게 된다.
도움말 상에
이벤트 흐름을 따라 이벤트 리스너를 추가할 수 있는 기능은 사용자 인터페이스 구성 요소에 객체가 두 개 이상 포함되어 있는 경우에 유용합니다. 예를 들어, 버튼 객체에 버튼 레이블로 사용되는 텍스트 객체가 포함될 수 있습니다. 이벤트 흐름에 리스너를 추가하는 기능이 없는 경우 버튼에서 발생하는 모든 클릭 이벤트에 대한 알림을 받으려면 버튼 객체와 텍스트 객체 둘 다에 리스너를 추가해야 합니다. 그러나 이벤트 흐름 기능을 사용하면 텍스트 객체 또는 텍스트 객체에 의해 식별되는 버튼 객체 영역에서 발생하는 클릭 이벤트를 처리하는 단일 이벤트 리스너를 버튼 객체에 추가할 수 있습니다.