2011-03-29 60 views
2

我一直在試圖將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設置虛擬機?

任何想法?我知道人們有這個工作,這是非常令人沮喪的。

謝謝。

回答

1

簡單的錯誤:jQuery的工廠方法生成jQuery.init對象,它的作用非常類似於數組。您需要在實際DOM元素上調用該方法,該元素是「數組」中的第一個成員。

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

如果您遇到安全問題,您將無法在Flash和JavaScript之間進行通信。

+0

非常感謝。究竟是什麼問題。我會把它包裝到一個JQuery方法中,所以我不必在任何地方粘貼0索引。 – PDizzle 2011-03-31 12:57:07

0

問題在於您訪問Flash對象的方式。 SwfObject的有一個內置函數,它照顧的是,它在所有瀏覽器的偉大工程:

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

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

我還沒有測試上面的代碼,但我想它應該工作!

+0

謝謝你。以前的答案確實有效,但我將會使用swfObject以及:) – PDizzle 2011-05-04 14:04:27