2011-03-29 4 views
2

JavaScript로 Flash에 대한 개념을 증명하려고 노력해 왔습니다. 나는 ActionScript 3.0과 JQuery와 Flash CS5를 사용하고 있습니다.ExternalInterface를 통해 Flash와 Flash로 의견을 교환하는 JavaScript

나는 플래시 개발자가 아니므로 코드에 사과드립니다. 이것이 작동한다고 증명할 수 있다면 플래시는 그들이 무엇을 하는지를 아는 사람에게 주어질 것입니다.

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; 
} 

자바 스크립트와 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가 끔찍하다는 것을 알고 있습니다. e는 자바 스크립트에서 플래시에 접속하는 것과 관련된 가능한 문제에 대해 많은 글을 읽었습니다 (따라서 보안 도메인 * 허용 및 디버그 텍스트 상자 추가 등).

사용중인 JavaScript가 머리에있는 스크립트 태그 내에 있습니다. changeType 및 addMenuActions는 내가 추가 한 JQuery 메서드입니다. 이들은 독립적으로 테스트되었지만 작동하는 자바 스크립트 메소드 일뿐입니다.

당신은 ActionScript의 내 시도 캐치의 마지막 줄은 것을 알 수 있습니다 :

flash.external.ExternalInterface.call("populateMenu", returnMenuItems()); 

이 작업은 플래시에서 전송 된 텍스트 내 메뉴를 채울 않습니다. 유일한 방법은 addCallback 함수를 사용하여 노출 된 메소드를 호출하는 것입니다.

method: changeBgColour, param: 4CB9E4 

하지만 오류가 말하는 :

Error: $("#AJC")[methodToCall] is not a function 
Source File: http://192.168.184.128/test.html# 
Line: 88 
나는 192.168.184.128 관련 아파치를 실행하는 로컬 VM을 설정

, 궁금를

나는 말한다 경고를 얻을 이것이 문제라면, 나는 두 개의 스레드가 로컬에서 플래시와 통신하려고 시도하는 것이 작동하지 않는다는 것을 언급 한 것을 보았습니다. 그래서 제가 아파치로 VM을 설정하는 이유는 무엇입니까?

아이디어가 있으십니까? 저는 사람들이이 일을하고 있다는 것을 압니다, 매우 실망 스럽습니다.

감사합니다.

답변

1

간단한 실수 : jQuery의 팩토리 메서드는 jQuery.init 객체를 생성합니다.이 객체는 배열과 매우 유사합니다. "배열"의 첫 번째 멤버 인 실제 DOM 요소에서 메서드를 호출해야합니다.

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

보안 문제가있는 경우 Flash와 JavaScript 사이에서 통신 할 수 없습니다.

+0

감사합니다. 문제가 정확히 무엇인지. 나는 그것을 JQuery 메서드로 마무리 할 것이므로 어디에서나 0 인덱스를 지정할 필요가 없습니다. – PDizzle

0

문제는 플래시 객체에 액세스하는 방식입니다. SwfObject가 알아서 내장 기능을 가지고, 모든 브라우저에서 잘 작동합니다 :

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

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

나는 위의 코드를 테스트를 havent,하지만 난 그것을 작동합니다 생각!

+0

고마워요. 이전 대답은 작동했지만 swfObject를 사용하여 이동해야합니다 :) – PDizzle

관련 문제