flex 4: ловить все события от определенного объекта - PullRequest
1 голос
/ 08 июля 2010

Есть ли способ отловить все события от определенного объекта?

Когда я использую addEventListener(), я должен указать тип события. Есть ли способ поймать их всех?

Спасибо!

1 Ответ

2 голосов
/ 08 июля 2010

Вы можете получить список всех объявленных событий, используя describeType. Вам нужно взглянуть на родительские классы, чтобы получить унаследованные события, и вы, вероятно, захотите избежать frameConstructed, enterFrame и exitFrame.

<?xml version="1.0"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" creationComplete="init()">
    <mx:Script><![CDATA[
        import flash.utils.describeType;
        import flash.utils.getDefinitionByName;

        private function init():void {

            var eventNames:Array = new Array();

            findEventsRecursive(btn, eventNames);

            for each(var eventName:String in eventNames) {
                if (eventName != "frameConstructed" &&
                    eventName != "exitFrame" &&
                    eventName != "enterFrame") {

                    btn.addEventListener(eventName, genericHandler);
                }
            }
        }

        private function genericHandler(event:Event) {
            trace(event.type + " triggered");
        }
        private function findEventsRecursive(instance:Object, eventNames:Array) {
            var description:XML = describeType(instance);

            findEvents(description, eventNames);

            for each(var parentType:String in description.extendsClass.@type) {
                var parentClass:Object = getDefinitionByName(parentType);
                var parentDescription:XML = describeType(parentClass);
                findEvents(parentDescription, eventNames);
            }
        }

        private function findEvents(description:XML, eventNames:Array) {
            for each(var eventName:XML in description.factory.metadata.(@name=='Event').arg.(@key=='name')) {
                eventNames.push(eventName.@value);
            }
        }


]]></mx:Script>

    <mx:Button id="btn" />
</mx:Application>

Но события не должны быть объявлены . Любой класс может отправлять события, используя строковые имена, и они не будут получены describeType (или любым другим механизмом).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...