이벤트 흐름

Flash Player 9 이상, Adobe AIR 1.0 이상

Flash Player 또는 AIR에서는 이벤트가 발생할 때마다 이벤트 객체를 전달합니다. 이때 이벤트 대상이 표시 목록에 없으면 이벤트 객체를 이벤트 대상에 직접 전달합니다. 예를 들어 Flash Player에서는 progress 이벤트 객체를 URLStream 객체에 직접 전달합니다. 그러나 이벤트 대상이 표시 목록에 있는 경우에는 이벤트 객체를 표시 목록에 전달하고 이 이벤트 객체는 해당 이벤트 대상을 찾을 때까지 표시 목록을 순회합니다.

이벤트 흐름은 이벤트 객체가 표시 목록을 이동하는 방식을 기술합니다. 표시 목록은 트리로 나타낼 수 있는 계층 구조로 구성되어 있으며, 표시 목록 계층 구조의 맨 위에는 Stage, 즉 표시 목록의 루트로 사용되는 특수한 표시 객체 컨테이너가 있습니다. Stage는 flash.display.Stage 클래스로 나타내고 표시 객체를 통해서만 액세스할 수 있습니다. 모든 표시 객체에는 해당 응용 프로그램의 Stage를 참조하는 stage 속성이 있습니다.

Flash Player 또는 AIR에서 표시 목록 관련 이벤트에 대한 이벤트 객체를 전달하는 경우 해당 이벤트 객체는 Stage에서 대상 노드까지 포함하는 라운드 트립을 만듭니다. DOM 이벤트 사양에서는 대상 노드를 이벤트 대상을 나타내는 노드로 정의합니다. 즉, 대상 노드는 이벤트가 발생한 표시 목록 객체입니다. 예를 들어 사용자가 child1이라는 표시 목록 객체를 클릭하면 Flash Player 또는 AIR에서 child1을 대상 노드로 사용하여 이벤트 객체를 전달합니다.

이벤트 흐름은 개념적으로 세 부분으로 구분됩니다. 첫 번째 부분은 캡처 단계라고 하고 Stage에서 대상 노드의 부모까지 모든 노드를 포함합니다. 두 번째 부분은 대상 단계라고 하고 대상 노드만 포함합니다. 마지막으로 세 번째 부분은 버블링 단계라고 하고 대상 노드의 부모에서 다시 Stage로 돌아오는 과정에서 만나게 되는 노드를 포함합니다.

다음 다이어그램과 같이 표시 목록을 Stage가 맨 위에 있는 세로 계층 구조로 생각해 보면 각 단계의 이름을 쉽게 이해할 수 있습니다.

사용자가 Child1 Node를 클릭하면 Flash Player 또는 AIR에서는 이벤트 객체를 이벤트 흐름에 전달합니다. 다음 그림과 같이 객체는 Stage에서 시작하여 아래에 있는 Parent NodeChild1 Node로 차례로 이동한 다음, 다시 Stage까지 위로 "버블링"됩니다. 버블링 단계에서 Stage로 이동할 때는 다시 Parent Node를 통과합니다.

이 예제에서 캡처 단계는 처음에 아래로 이동하는 동안 StageParent Node를 포함하고 대상 단계는 Child1 Node에서 소비한 시간을 포함합니다. 마지막으로 버블링 단계는 다시 루트 노드로 이동하는 동안 만나는 Parent NodeStage를 포함합니다.

이벤트 흐름 덕분에 ActionScript 프로그래머는 이전에 비해 더욱 강력한 이벤트 처리 시스템을 사용할 수 있습니다. 이전 버전의 ActionScript에는 이벤트 흐름이 없으므로 이벤트를 생성하는 객체에만 이벤트 리스너를 추가할 수 있습니다. 그러나 ActionScript 3.0에서는 대상 노드뿐만 아니라 이벤트 흐름을 따라 모든 노드에 이벤트 리스너를 추가할 수 있습니다.

이벤트 흐름을 따라 이벤트 리스너를 추가할 수 있는 기능은 사용자 인터페이스 구성 요소에 객체가 두 개 이상 포함되어 있는 경우에 유용합니다. 예를 들어 버튼 객체에 버튼 레이블로 사용되는 텍스트 객체가 포함될 수 있습니다. 이벤트 흐름에 리스너를 추가하는 기능이 없는 경우 버튼에서 발생하는 모든 클릭 이벤트에 대한 알림을 받으려면 버튼 객체와 텍스트 객체 둘 다에 리스너를 추가해야 합니다. 그러나 이벤트 흐름 기능을 사용하면 텍스트 객체 또는 텍스트 객체에 의해 식별되는 버튼 객체 영역에서 발생하는 클릭 이벤트를 처리하는 단일 이벤트 리스너를 버튼 객체에 추가할 수 있습니다.

그러나 이벤트 흐름의 세 단계 중 일부 단계에 참여하지 못하는 이벤트 객체도 있습니다. enterFrameinit 이벤트 유형 등 일부 유형의 이벤트는 대상 노드에 직접 전달되고 캡처 단계 및 버블링 단계에 참여하지 않습니다. Socket 클래스의 인스턴스에 전달되는 이벤트와 같이 표시 목록에 없는 객체를 대상으로 하는 이벤트도 있습니다. 이러한 이벤트 객체도 캡처 및 버블링 단계에 참여하지 않고 대상 객체에 직접 전달됩니다.

특정 이벤트 유형의 동작 방식을 확인하려면 API 설명서를 확인하거나 이벤트 객체의 속성을 검토하십시오. 이벤트 객체의 속성을 검토하는 데 대한 자세한 내용은 다음 단원에서 설명합니다.