2010-07-08 48 views

回答

2

您可以使用describeType获得所有已声明事件的列表。您需要查看父类以获取继承事件,并且您可能需要避免frameConstructedenterFrameexitFrame

<?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 [email protected]) { 
       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([email protected]); 
      } 
     } 


]]></mx:Script> 

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

但事件没有被宣布。任何班级都可以使用字符串名称发送事件,而这些不会被describeType(或通过任何其他机制)获取。