JavaScript通过ExternalInterface与Flash通信

我一直试图将JavaScript与Flash谈话的概念证明放在一起。我正在使用JQuery和Flash CS5,ActionScript 3。 我不是Flash开发人员,所以对代码表示道歉,如果我能证明这是有效的,那么Flash将被提供给知道他们正在做什么的人。 Actionscript位于第一帧的时间轴中的一个图层上,根电影中有几个元素:
output = new TextField();
output.y = -200;
output.x = -200;
output.width = 450;
output.height = 325;
output.multiline = true;
output.wordWrap = true;
output.border = true;
output.text = "Initializing...n";
root.bgClip.addChild(output); 
try{
     Security.allowDomain("*");
     flash.external.ExternalInterface.marshallExceptions = true;
     output.appendText("External Interface Available? " + ExternalInterface.available + "n");
     output.appendText("External Interface ObjectId: " + ExternalInterface.objectID + "n");
     flash.external.ExternalInterface.addCallback("getMenuItems", returnMenuItems);
     flash.external.ExternalInterface.addCallback("changeText", changeText);
     flash.external.ExternalInterface.addCallback("changeBgColour", changeBgColour);
     flash.external.ExternalInterface.call("populateMenu", returnMenuItems());
} catch (error:SecurityError) {
    output.appendText("Security Error: " + error.message + "n");
} catch (error:Error) {
    output.appendText("Error: " + error.message + "n");
}
function returnMenuItems():String{
    return "[{"menu option": "javascript:callFlash('changeBgColour','4CB9E4')"}]";
}
function changeText(t:String){
    root.textClip.text = t;
}
function changeBgColour(colour:String) {
     var c:ColorTransform = root.bgClip.transform.colorTransform;
     c.color = uint(colour);
     root.bgClip.transform.colorTransform = c;
}
JavaScript和HTML是:
function populateMenu(message){
    $("#options").changeType("Options", $.parseJSON(message));
    $("#options").addMenuActions();
}
function callFlash(methodToCall, param){
    alert("method: " + methodToCall + ", param: " + param);
    if(param == undefined){
        $("#AJC")[methodToCall]();
    }else{
        $("#AJC")[methodToCall](param);
    }
}
var flashvars = {};
var params = {allowScriptAccess: "always"};
var attributes = {name: "AJC"};
swfobject.embedSWF("http://192.168.184.128/ActionscriptJavascriptCommunication.swf", "AJC", "600", "400", "9", "", flashvars, params, attributes);
<body>
  <div id="wrapper">
    <div id="topBar" class="top-bar"></div>
    <div id="flashContainer">
      <div id="AJC">Loading Flash...</div>
    </div>
    <ul class="dropdown" id="games"></ul>
    <ul class="dropdown" id="options"></ul>
  </div>
</body>
现在我知道ActionScript很糟糕,它看起来像它的原因是因为我已经阅读了很多关于从JavaScript联系Flash的可能问题的线程(因此允许安全域*并添加调试文本框等)。 我正在使用的JavaScript位于头部的脚本标记内。 changeType和addMenuActions只是我添加的JQuery方法。这些只是经过独立测试但确实有效的JavaScript方法。 您会注意到我在ActionScript中捕获的最后一行是:
flash.external.ExternalInterface.call("populateMenu", returnMenuItems());
这确实有效,它使用Flash发送的文本填充我的菜单。唯一不起作用的是尝试使用addCallback函数调用公开的方法。 我收到的警告说:
method: changeBgColour, param: 4CB9E4
但是一个错误说:
Error: $("#AJC")[methodToCall] is not a function
Source File: http://192.168.184.128/test.html#
Line: 88
我设置了一个运行Apache的本地虚拟机,它与192.168.184.128有关,我想知道这是不是问题,我看到有几个线程提到尝试与本地闪存通信不起作用,这就是为什么我用apache设置VM? 有任何想法吗?我知道人们有这个工作,这是非常令人沮丧的。 谢谢。     
已邀请:
简单的错误:jQuery的工厂方法生成jQuery.init对象,其行为与数组非常相似。您需要在实际DOM元素上调用该方法,该元素是“数组”中的第一个成员。
$('#AJC')[0][methodToCall]
如果您遇到安全问题,则根本无法在Flash和JavaScript之间进行通信。     
问题在于您访问Flash对象的方式。 SwfObject有一个内置函数可以解决这个问题,它适用于所有浏览器:
function callFlash(methodToCall, param)
{
    var obj = swfobject.getObjectById("AJC");

    if(param == undefined){
        $(obj)[methodToCall]();
    }else{
        $(obj)[methodToCall](param);
    }
}
我没有测试上面的代码,但我想它应该工作!     

要回复问题请先登录注册