Удалить всех слушателей ENTER_FRAME - PullRequest
0 голосов
/ 09 марта 2011

Есть ли способ удалить ВСЕ приемники событий ENTER_FRAME сразу?

Ответы [ 2 ]

3 голосов
/ 10 марта 2011

Только если вы внимательно следите за своими слушателями. Для слушателей событий нет функции типа «removeAll», поэтому она помогает собирать слушателей в удобном для управления месте.

2 голосов
/ 10 марта 2011

Можно создать класс, который будет обрабатывать добавление прослушивателей событий для IEventDispatcher объектов, регистрируя эти объекты и одновременно удаляя всех прослушивателей событий. Ниже приведен пример, который я быстро сделал, чтобы продемонстрировать это:

EventListeners.as:

package
{
    import flash.events.Event;
    import flash.events.IEventDispatcher;
    import flash.utils.Dictionary;

    public class EventListeners
    {
        private var _objectDictionaries:Vector.<Dictionary>;

        public function EventListeners()
        {
            init();

        }// end function

        public function addEventListener(object:IEventDispatcher,
                                         type:String,  
                                         listener:Function, 
                                         useCapture:Boolean = false,
                                         priority:int = 0,
                                         useWeakReference:Boolean = false)
        {
            object.addEventListener(type, listener, useCapture, priority, useWeakReference);

            var objectDictionary:Dictionary = new Dictionary();
            objectDictionary["object"] = object;
            objectDictionary["type"] = type;
            objectDictionary["listener"] = listener;
            objectDictionary["useCapture"] = useCapture;
            _objectDictionaries.push(objectDictionary);

        }// end function

        public function removeAll():void
        {
            for each(var objectDictionary:Dictionary in _objectDictionaries)
            {
                var object:IEventDispatcher = objectDictionary["object"] as IEventDispatcher;
                var type:String = objectDictionary["type"] as String;
                var listener:Function = objectDictionary["listener"] as Function;
                var useCapture:Boolean = objectDictionary["useCapture"] as Boolean;

                object.removeEventListener(type, listener, useCapture);

            }// end for

            init();

        }// end function

        private function init():void
        {
            _objectDictionaries = new Vector.<Dictionary>();

        }// end function

    }// end class

}// end package

Main.as:

package
{
    import flash.display.Sprite;
    import flash.events.Event;

    public class Main extends Sprite
    {
        private var _eventListeners:EventListeners;
        private var _sprite1:Sprite;
        private var _sprite2:Sprite;

        public function Main()
        {
            init();

        }// end function

        public function init():void
        {
            _eventListeners = new EventListeners();
            _sprite1 = new Sprite();
            _sprite2 = new Sprite();

            _eventListeners.addEventListener(_sprite1, Event.ENTER_FRAME, enterFrameHandler);
            _eventListeners.addEventListener(_sprite2,  Event.ADDED_TO_STAGE, addedToStageHandler);

            trace("_sprite1.hasEventListener = " + _sprite1.hasEventListener(Event.ENTER_FRAME));
            trace("_sprite2.hasEventListener = " + _sprite2.hasEventListener(Event.ADDED_TO_STAGE));

            _eventListeners.removeAll();

            trace("\n_eventListeners.removeAll() invoked\n");

            trace("_sprite1.hasEventListener = " + _sprite1.hasEventListener(Event.ENTER_FRAME));
            trace("_sprite2.hasEventListener = " + _sprite2.hasEventListener(Event.ADDED_TO_STAGE));

        }// end function

        private function enterFrameHandler(e:Event):void {};
        private function addedToStageHandler(e:Event):void {};

    }// end class

}// end package

Результат выполнения этого примера следующий:

_sprite1.hasEventListener = true
_sprite2.hasEventListener = true

_eventListeners.removeAll() invoked

_sprite1.hasEventListener = false
_sprite2.hasEventListener = false
...