본문 바로가기

Blog/Flex

Event의 흐름 제어

이벤트 모델은 ActionScript 3.0 에서 상당히 중요한 부분입니다. 그만큼 여러 자료가 많이 있지만 이벤트 전파를 제어하는 방법에 대해서 정리 차원에서 남겨봅니다.

preventDefault() 메서드

예를 들면 여러 책에 많이 소개되어 있듯이 텍스트박스에 키보드로 입력했을 때 입력된 문자열을 표시해주는게 텍스트박스의 기본 동작입니다. 이런 기본 동작을 중간에서 무시하게 하거나 이벤트 전파를 멈추게 하거나 하는 방법입니다.

A. 이거슨 컴포넌트 제작할 때 이벤트가 발생되는 부분

    private function dispatcher():void
    {
        
// 이벤트 객체의 cancelable 매개변수를 true로 설정
        var e:Event = new Event(type, bubble, cancelable = true
);
        
// 이벤트가 발생되면 등록된 이벤트리스너가 쭉 실행이 되고

        dispatchEvent(e);
        
        
// 여기는 현재 이벤트 전달이 완료된 상태
        // preventDefault() 가 등록된 리스너 어디에선가 호출 되었을지도 모르지~
        
        
// 등록된 이벤트 리스너 중에서 preventDefault() 메서드 호출이 없었다면
        if(!e.isDefaultPrevented()
){
            
// 기본 동작 수행
        }
    }

B. 이거슨 컴포넌트를 사용하는 쪽에서 전달받은 이벤트를 처리하는 부분

    private function eventListener(e:Event):void
    {
        
// 여기에 무슨 무슨 조건을 달고서 잘 안맞는다 싶을 때
        // 기본 동작을 작동하지 못하게 함.
        e.preventDefault();
    }

preventDefault() 메서드 내부에는 cancelable 값이 true 일때만 (default=false) 작동합니다. 그래서 이벤트 발생부(A)에서 이벤트 객체의 cancelable 매개변수를 통해 기본 동작을 제어할 수 있게 할 것인지를 허용해 주어야 합니다.

또한가지 중요한 사실은 preventDefault()는 메서드 이름 그대로 Default 함수 호출을 막는 것입니다. 이벤트 흐름을 막는 것과는 다소 차이가 있죠. 그렇기 때문에stopImmediatePropagation() 메서드 호출로 이벤트 흐름을 막는다 하더라도 Default 함수 호출과는 무관합니다. 흐름과 관계없이 Default 함수는 호출됩니다.  그렇기 때문에 아래 두 메서드를 지원해 줍니다. (메서드 이름이 정말 직관적이네요 - Propagation [전파, 번짐] )

stopPropagation() 메서드
현재 Node(Bubbling 이벤트 구조상 현재 이벤트가 전파 되고있는 객체)에서만 이벤트 흐름을 종료합니다. 따라서 이벤트는 다음 Node로 넘어가서 계속 전파됩니다.

stopImmediatePropagation() 메서드
이벤트 흐름 지체를 즉시 종료 합니다. 현재 처리되고 있는 이벤트 리스너에 대한 실행이 끝나면 이벤트 전파를 중단해 버리는 거죠.

아직 AS3.0으로는 이벤트를 디테일하게 제어해야 하는 코드를 짜본 적은 없지만 예전에 AS 2.0 EventDispatcher 를 사용했을 때 등록된 이벤트 리스너의 실행 순서를 조절하는 것과 중간에 중단시키는 것 때문에 참 고생했던 기억이 나네요. 처음엔 이런 것도 지원 해줬으면 참 좋을 텐데로 시작했다가 나중엔 뭐 이런 것도 없어 하면서 굉장히 열냈었죠. 다행히도 AS3.0 에서는 리스너의 실행 순서를 제어할 수 있고 (addEventListener 메서드의 priority 매개변수 ), 위 세가지 메서드로 이벤트 흐름까지도 제어할 수 있습니다. 하지만 이런 기능들을 계획 없이 사용하다 보면 나중에 코드의 흐름을 찿기 위해 여기저기 돌아다녀야 할지도 모른다는… 그러면 디버깅 하기가 참 어려워지겠죠.

참고

Essential ActionScript 3.0 – 콜린무크. 12장 이벤트와 이벤트 처리.
Action Script 3.0 – 윤훈남. 10장 이벤트 모델.