http://www.adobe.com/kr/devnet/flash/articles/external_interface.html
EXTERNALINTERFACE.ADDCALLBACK()
ExternalInterface.addCallback() 은 Javascript 에서Flash 의 사용자 정의 함수를 호출할 수 있게 callback 함수를 등록하는 메쏘드 입니다. 이전의 Javascript 에서는 제한적으로 Flash 의 내장함수만으로 호출 할 수 있었으나 ExternalInterface.addCallback()을 통해서 Flash 에서 정의된 사용자 함수를 직접 호출 하여 사용성이 편리해졌습니다. 또한 여러 개의 매개변수를 넘겨 줄 수 있기 때문에 더 이상 split 으로 쪼개어서 사용하지 않아도 됩니다.
가장 기본적인 형태는
ExternalInterface.addCallback (methodName:String,method:Function)
입니다.
매개변수는 다음과 같은 의미를 지닙니다.
MethodName : JavaScript에서 ActionScript 함수가 호출되는 이름입니다.instance: 메서드에서 this가 확인하는 객체입니다. 이 객체는 해당 메서드를 찾을 수 있는 객체일 필요는 없으며, 객체 또는 null을 지정할 수 있습니다.method : JavaScript에서 호출되는 ActionScript 메서드입니다.
다음의 코드를 Flash 에 작성합니다.
import flash.external.*; // 자바스크립에서 호출할 플래시 변수명 var flashFunction:String = "callPlayBall"; // 변수명에 의해 실행되는 콜백함수 var realFunction:Function = playBall;
ExternalInterface.addCallback(flashFunction, realFunction);
function playBall(tgX:Number, tgY:Number, spd:Number):Void { moveMC(ball_mc, tgX, tgY, spd); } // 감속의 움직임 function moveMC(tgMC:MovieClip, tgX:Number, tgY:Number, spd:Number):Void { var mc:MovieClip = tgMC.createEmptyMovieClip("tp_chProp", 98765); mc.onEnterFrame = function() { this._parent._x += spd*(tgX-this._parent._x); this._parent._y += spd*(tgY-this._parent._y); var diffX:Number = Math.abs(tgX-this._parent._x); var diffY:Number = Math.abs(tgY-this._parent._y); if (diffX<0.5 && diffY<0.5) { this._parent._x = tgX; this._parent._y = tgY; this.removeMovieClip(); } }; }
다음과 같은 JavaScript 코드를 작성합니다.
<script language="JavaScript">
function callExternalInterface() {
// FlashID(ExternalInterface_addCallback) 에 있는 callPlayBall 에 등록되어 있는 함수를 를 매개변수 의 값으로 호출 합니다.
getMovieName("ExternalInterface_addCallback").callPlayBall(inputValue.x.value, inputValue.y.value, inputValue.spd.value);
}
// flashID 의 이름을 받아서 브라우저의 속성에 따라 flashID 의 값을 브라우저에 맞게 변경해 주는 함수 입니다.
function getMovieName(movieName) {
if (navigator.appName.indexOf("Microsoft") != -1) {
return window[movieName]
}
else {
return document[movieName]
}
}
</script>
다음의 코드를 HTML 의 body 에 작성합니다.
<!-- 버튼을 클릭하면 "callExternalInterface()" 함수를 호출합니다.-->
<input type="button" onClick="callExternalInterface()" value="Call Flash Function" />
</form>
<!—inputValue 에 각각 인풋텍스트에서의 값 x, y, spd 의 변수값을 저장합니다.-->
<form name="inputValue">
Positon X <input type="text" name="x" size="10" >
Position Y <input type="text" name="y" size="10" >
Speed <input type="text" name="spd" size="10" >
</form>
플래시 기술문서를 토대로 FLASH Player 10 적용하면,
< html 문서 >
// 플래시와 데이터를 주고 받는 부분
var jsReady = false;
function isReady() {
return jsReady;
}
function pageInit() {
jsReady = true;
document.forms["form1"].output.value += "\n" + "JavaScript is ready.\n";
}
function thisMovie(movieName) {
if (navigator.appName.indexOf("Microsoft") != -1) {
return window[movieName];
} else {
return document[movieName];
}
}
//플래시로 데이터를 보내는 부분
function sendToActionScript(value) {
thisMovie("ExternalInterface").sendToActionScript(value);
}
//플래시로부터 데이터를 받는 부분
function sendToJavaScript(value) {
document.forms["form1"].output.value += "ActionScript says: " + value + "\n";
}
/////////////////////////////////////////////////
// -->
</script>
<body bgcolor="#999999" onload="pageInit()">
<!--url's used in the movie-->
<!--text used in the movie-->
<!-- saved from url=(0013)about:internet -->
<script language="JavaScript" type="text/javascript">
AC_FL_RunContent(
'codebase', 'http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=10,0,0,0',
'width', '550',
'height', '400',
'src', 'ExternalInterface',
'quality', 'high',
'pluginspage', 'http://www.adobe.com/go/getflashplayer',
'align', 'left',
'play', 'true',
'loop', 'true',
'scale', 'noscale',
'wmode', 'window',
'devicefont', 'false',
'id', 'ExternalInterface',
'bgcolor', '#999999',
'name', 'ExternalInterface',
'menu', 'true',
'allowFullScreen', 'false',
'allowScriptAccess','always',
'movie', 'ExternalInterface',
'salign', ''
); //end AC code
</script>
<noscript>
<object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=10,0,0,0" width="550" height="400" id="ExternalInterface" align="left">
<param name="allowScriptAccess" value="always" />
<param name="allowFullScreen" value="false" />
<param name="movie" value="ExternalInterface.swf" />
<param name="quality" value="high" />
<param name="scale" value="noscale" />
<param name="bgcolor" value="#999999" />
<embed src="ExternalInterface.swf" quality="high" scale="noscale" bgcolor="#999999" width="550" height="400" name="ExternalInterface" align="left" allowScriptAccess="sameDomain" allowFullScreen="false" type="application/x-shockwave-flash" pluginspage="http://www.adobe.com/go/getflashplayer" />
</object>
</noscript>
<input type="text" name="input" value="" />
<input type="button" value="Send" onclick="sendToActionScript(this.form.input.value);" /><br />
<textarea cols="60" rows="20" name="output" readonly="true">Initializing...</textarea>
</form>
</html>
플래시 문서
ExternalInterfaceExample.as |
HTML 문서
ExternalInterface.html |


ExternalInterfaceExample.as
ExternalInterface.html


