flex 4: catch all events from a specific object
Is there a wa开发者_C百科y to catch all events from a specific object?
When I use addEventListener() I must provide the event type. Is there a way to catch them all?
Thanks!
You can get a list of all declared events using describeType. You'll need to look at parent classes to get inherited events and you'll probably want to avoid frameConstructed, enterFrame and 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>
But events don't have to be declared. Any class can send events using string names and those will not get picked up by describeType (or through any other mechanism).
加载中,请稍侯......
精彩评论