0

我正在尝试使用 JSFL 为 Flash CS5.5 创建一个 swfPanel。我在 Flash 中创建了我的界面并尝试与 JSFL 命令进行通信。因此,在我的 .fla 文件中,我使用带有 callBack 的 ExternalInterface 来调用 JSFL 中的特定函数,然后使用 swfPanel.call() 进行返回。我遇到的问题是我不能传递一个数组作为调用函数的参数(在 AS3 函数名之后)。这是代码:

在 AS3 中:

function init():void{
    ExternalInterface.addCallback("callBackPanel", JsflCallback);
    MMExecute("fl.runScript( fl.configURI + \"AirMobileFramework/AirMobileFrameworkPanel.jsfl\", \"checkSettings\" );");
}

function JsflCallback(... args):void{
    jsTrace("callback");
}

function jsTrace(str:String):void{
    MMExecute("fl.trace(\"" + str + "\");");
}

在 JSFL 中:

function checkSettings(){   
    var fileSettingsUrl = fl.configURI + "AirMobileFramework/settings.fwk";
    var exist = FLfile.exists(fileSettingsUrl);
    var result = new Array("settings", exist);

    if(!exist){
        FLfile.write(fileSettingsUrl, "");
    } else {
        result.push(FLfile.read(fileSettingsUrl));
    }

    callPanelBack(result);
}

function callPanelBack(result){
    fl.trace("result: " + result.length + " > " + typeof result + " >> " + result[0]);
    var panel;
    if(fl.swfPanels.length > 0){ 
        for(x = 0; x < fl.swfPanels.length; x++){
            if(fl.swfPanels[x].name == "AirMobileFramework"){ 
                panel = fl.swfPanels[x];
                panel.call("callBackPanel", result); 
                break; 
            } 
        }
    } else {
        fl.trace("No existing panel");
    }
}

当调用panel.call("callBackPanel", result[0], result[1]); 没有问题,我的回调很好调用,但是使用panel.call("callBackPanel", result); 我有一个错误: La ou les erreurs JavaScript suivantes se sont produites lors de l'exécution de AirMobileFramework : La ou les erreur(s) JavaScript suivantes se sont produites :

任何的想法 ??

4

2 回答 2

0

我猜这是因为 JSFL 无法解析数组。在您给出的示例中,使用 result[0], result[1] 您有单独的值(可能是字符串或数字),这应该没有问题。

我要做的是:

panel.call("callBackPanel", result.join("@*$");

在 as3 函数中只是 arg.split("@*$")

如果您的输入可以包含字符串“@*$”,那么您可以简单地为结果中的每个项目调用 SWF,当您完成那里的循环后,告诉 SWF 收集这些东西 - 像这样:

function callPanelBack(result){
    fl.trace("result: " + result.length + " > " + typeof result + " >> " + result[0]);
    var panel;
    if(fl.swfPanels.length > 0){ 
        for(x = 0; x < fl.swfPanels.length; x++){
            if(fl.swfPanels[x].name == "AirMobileFramework"){ 
                panel = fl.swfPanels[x];
                panel.call("callBackPanelStart"); 
                for(var i=0; i < result.length; i++){
                    panel.call("callBackPanelArgument", result[i])
                }
                panel.call("callBackPanelEnd"); 
                break; 
            } 
        }
    } else {
        fl.trace("No existing panel");
    }
}

然后在 AS3 中:

function callBackPanelStart():void
{
    jsflArray = [];
}

function callBackPanelArgument(argument:*):void
{
    jsflArray.push(argument);
}

function callBackPanelEnd():void
{
    // execute whatever you must on the result
}
于 2011-09-18T13:25:47.047 回答
0

这是您需要从 JSFL 来回传递数组:http: //exanimo.com/actionscript/jsflinterface/

值得一看的是,一旦它在一周左右发布:http ://www.xjsfl.com

于 2011-09-24T11:42:01.310 回答