JavaScript通过外部接口与Flash对话

JavaScript通过外部接口与Flash对话,javascript,flash,actionscript,externalinterface,Javascript,Flash,Actionscript,Externalinterface,我一直在尝试将JavaScript与Flash对话的概念证明放在一起。我正在使用JQuery和FlashCS5,ActionScript3 我不是一个Flash开发人员,所以为代码道歉,如果我能证明这是有效的,Flash将提供给知道他们在做什么的人 Actionscript位于第一帧时间线上的一个层上,根电影中有几个元素: output = new TextField(); output.y = -200; output.x = -200; output.width = 450; output.

我一直在尝试将JavaScript与Flash对话的概念证明放在一起。我正在使用JQuery和FlashCS5,ActionScript3

我不是一个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);

这确实有效,它用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相关,我想知道这是否是问题所在,我看到一些线程提到尝试在本地与flash通信无法工作,这就是我使用Apache设置虚拟机的原因

有什么想法吗?我知道人们已经开始这样做了,这是非常令人沮丧的


谢谢。

一个简单的错误:jQuery的工厂方法生成jQuery.init对象,它的行为非常类似于数组。您需要对实际的DOM元素调用该方法,该元素是“数组”中的第一个成员


如果存在安全问题,您将无法在Flash和JavaScript之间进行通信。

问题在于您访问Flash对象的方式。SwfObject有一个内置的函数来处理这个问题,它在所有浏览器中都能很好地工作:

function callFlash(methodToCall, param)
{
    var obj = swfobject.getObjectById("AJC");

    if(param == undefined){
        $(obj)[methodToCall]();
    }else{
        $(obj)[methodToCall](param);
    }
}

我还没有测试上面的代码,但我想它应该可以工作

非常感谢。问题到底是什么。我将把它包装成一个JQuery方法,这样我就不必到处粘贴0索引了。谢谢。前面的答案确实有效,但我也将尝试使用swfObject:)
Error: $("#AJC")[methodToCall] is not a function
Source File: http://192.168.184.128/test.html#
Line: 88
$('#AJC')[0][methodToCall]
function callFlash(methodToCall, param)
{
    var obj = swfobject.getObjectById("AJC");

    if(param == undefined){
        $(obj)[methodToCall]();
    }else{
        $(obj)[methodToCall](param);
    }
}