最近我被要求更改我使用外部回调而不是使用嵌入式按钮的小型Flash应用程序。
我尝试自动化该过程并提出了这个功能:
/**
* Add an External callback for all PUBLIC methods that listen to 'listenerType' in 'listenersHolder'.
* @param listenersHolder - the class that holds the listeners we want to expose.
* @param listenerType - a String with the name of the event type we want to replace with the external callback.
*/
public static function addCallbacksForListeners(listenersHolder:*, listenerType:String):void
{
// get the holder description
var description:XML = describeType(listenersHolder);
// go over the methods
for each(var methodXML:XML in description..method)
{
// go over the methods parameters
for each(var parameterXML:XML in methodXML..parameter)
{
// look for the requested listener type
var parameterType:String = parameterXML.@type;
if (parameterType.indexOf(listenerType) > -1)
{
var methodName:String = methodXML.@name;
trace("Found: " + methodName);
// get the actual method
var method:Function = listenersHolder[methodName];
// add the callback
try
{
ExternalInterface.addCallback(methodName, method);
trace("A new callback was added for " + methodName);
}
catch (err:Error)
{
trace("Error adding callback for " + methodName);
trace(err.message);
}
}
}
}
在使用此函数之前,我必须将侦听器的函数更改为Public,添加null default参数,当然还要删除/隐藏视觉效果。
例如,来自:
私有函数onB1Click(e:MouseEvent):void
到:
公共函数onB1Click(e:MouseEvent = null):void
将此行添加到init / onAddedToStage函数:
addCallbacksForListeners(this,“MouseEvent”);
并从舞台上删除按钮或只是注释添加它的行。
我的问题是:你能找到更好/更有效的方法吗? 任何反馈都欢迎..
答案 0 :(得分:3)
也许你应该让javascript用不同的functionName参数调用一个方法。然后你只需要添加一个回调,而不需要公开所有这些函数。
ExternalInterface.addCallback('callback', onCallback);
public function onCallback(res:Object)
{
var functionName:String = res.functionName;
this[functionName]();
}