我一直在試圖將JavaScript的概念證明與Flash交談。我正在使用JQuery和Flash CS5,ActionScript 3.我不是Flash開發人員,所以如果我可以證明這一點,我將不會向Flash開發人員道歉,否則Flash將會提供給知道他們在做什麼的人。JavaScript通過ExternalInterface與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是可怕的,它看起來像它的原因是因爲我hav e閱讀了大量有關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,我想知道如果這是問題,我已經看到一些線程提到嘗試與本地Flash進行通信將不起作用,這就是爲什麼我使用apache設置虛擬機?
任何想法?我知道人們有這個工作,這是非常令人沮喪的。
謝謝。
非常感謝。究竟是什麼問題。我會把它包裝到一個JQuery方法中,所以我不必在任何地方粘貼0索引。 – PDizzle 2011-03-31 12:57:07