Как удалить все прослушиватели событий из экранного объекта? - PullRequest
9 голосов
/ 21 сентября 2009

Есть ли способ определить, какие прослушиватели событий зарегистрированы с помощью экранного объекта? Я хочу удалить все прослушиватели событий из экранного объекта, чтобы можно было назначать новые прослушиватели на основе изменений контекста в приложении.

Ответы [ 5 ]

8 голосов
/ 22 сентября 2009

back2dos упомянул подход, который вы должны использовать, я расширил класс movieclip и реализовал все виды функций, которые я использую ежедневно, но не являюсь частью класса movieclip. включая переопределение для класса addEventListener

protected var listeners : Dictionary    = new Dictionary();
override public function addEventListener( type : String, listener : Function, useCapture : Boolean = false, priority : int = 0, useWeakReference : Boolean = true) : void
{
        var key : Object = {type:type,useCapture:useCapture};
        if( listeners[ key ] ) {
                removeEventListener( type, listeners[ key ], useCapture );
                listeners[ key ] = null;
        }
        listeners[ key ] = listener;

        super.addEventListener( type, listener, useCapture, priority, useWeakReference );
}
protected function removeListeners () : void
{
        try
        {
            for (var key:Object in listeners) {
                    removeEventListener( key.type, listeners[ key ], key.useCapture );
                        listeners[ key ] = null;
            }
        }catch(e:Error){}
}
7 голосов
/ 21 сентября 2009

Джисейпер прав ...

сторона, хотя: DisplayObject расширяет EventDispatcher, которая уже реализует IEventDispatcher ... так что если быть более точным: вам нужно переопределить addEventListener и removeEventListener, чтобы отслеживать слушателей. ..

несколько технических деталей: я предлагаю вам использовать Dictionary для хранения функций обработчика ... немного медленнее для вставки, но намного быстрее для удаления ... также Dictionary поддерживает слабые ссылки, что очень важно в случае обработки событий ... также имейте в виду, что useCapture позволяет добавить один и тот же обработчик дважды ...

тогда удачи ...;)

4 голосов
/ 21 сентября 2009

Гленн прав, нет такой вещи, как метод removeAllListener или listAllListener. Тем не менее, вы можете заставить свой custum diplayObject реализовывать интерфейс IEventDispatcher и отслеживать все прослушиватели, добавленные или удаленные из вашего объекта.

2 голосов
/ 23 сентября 2009

Это своего рода хак, но в некоторых (возможно, в большинстве случаев) вы можете легко установить экранный объект на ноль и повторно инициализировать его, а затем перенастроить с нулевым визуальным нарушением.

Добавлен бонус удаления всех слушателей событий.

Если вы не делаете это в приложении, в котором уже есть сотни слушателей и объектов, то оно должно работать идеально, если вы можете перенастроить конфигурацию вашего экранного объекта.

Очевидно, что вы не должны делать это с тем, что делает что-то сумасшедшее в конструкторе, например, с загрузкой данных.

0 голосов
/ 10 февраля 2012
function a(){
    mc.addEventListener(Event.ENTER_FRAME,function(){
                       ...
                       }
}

function b(){
    mc.removeEventListener(Event.ENTER_FRAME,function(){});
}

работает ...

...