AS3为侦听器添加回调

时间:2012-12-12 16:26:37

标签: actionscript-3 button callback listener

最近我被要求更改我使用外部回调而不是使用嵌入式按钮的小型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”);

并从舞台上删除按钮或只是注释添加它的行。

我的问题是:你能找到更好/更有效的方法吗? 任何反馈都欢迎..

1 个答案:

答案 0 :(得分:3)

也许你应该让javascript用不同的functionName参数调用一个方法。然后你只需要添加一个回调,而不需要公开所有这些函数。

ExternalInterface.addCallback('callback', onCallback);

public function onCallback(res:Object)
{
    var functionName:String = res.functionName;
    this[functionName]();
}