gpt4 book ai didi

JavaScript 通过 ExternalInterface 与 Flash 对话

转载 作者:行者123 更新时间:2023-11-30 06:05:07 28 4
gpt4 key购买 nike

我一直在尝试整理 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 中的 try catch 的最后一行是:

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

我设置了一个本地 VM 来运行 Apache,它与 192.168.184.128 相关,我想知道这是否是问题所在,我看到有几个线程提到尝试在本地与 flash 通信将不起作用,这这就是我用 apache 设置 VM 的原因?

有什么想法吗?我知道人们已经做到了这一点,这非常令人沮丧。

谢谢。

最佳答案

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

$('#AJC')[0][methodToCall]

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

关于JavaScript 通过 ExternalInterface 与 Flash 对话,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5475401/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com