보통 호출 방법
// 플래시 내부 함수 호출
function thisMovie(movieName) {
if (navigator.appName.indexOf("Microsoft") != -1) {
return window[movieName]
}
else {
return document[movieName]
}
}
// 플래시에 내부에 있는 setSafecardMark 함수를 호출
thisMovie("safecard").setSafecardMark(index,length);
그러나 위의 방법들이 안된다.. 그러면 아래와 같이 한다.
1. Dom을 이용해 플래쉬에 접근하는 경우 E에서는 Object의 ID를 FF에서는 Embed의 ID를 사용하게 된다. 즉 아래와 같다.
<object id="id1"><embed src="test.swf" id="id1" /></object>
위와 같이 설정하고
document.getElementById('id1')
라고 하면 IE에서는 정상동작하겠지만 FF에서는 Object를 참조하기 때문에 오동작하게된다.
2. <form></form> 안에서 사용하면 안된다.
<form>
form으로 둘러싸인 플래쉬 무비에서 ExternalInterface를 addCall 하면 해당 플래쉬의 ID를 찾을 수 없다는 에러를 발생시킨다.
</form>
이 문제는 아래의 코드를 사용해 해결할 수 있다. ExternalInterface를 사용하는 페이지에 아래의 로직을 인클루드시킨다.
<script type="javascript/text">
function ExternalInterfaceManager() {
this.registerMovie = function(movieName) {
if(!window.fakeMovies) window.fakeMovies = new Array();
window.fakeMovies[window.fakeMovies.length] = movieName;
}
this.initialize = function() {
if(document.all) {
if(window.fakeMovies) {
for(i=0;i<window.fakeMovies.length;i++) {
window[window.fakeMovies[i]] = new Object();
}
window.onload = initializeExternalInterface;
}
}
}
}
function initializeExternalInterface() {
for(i=0;i<window.fakeMovies.length;i++) {
var movieName = window.fakeMovies[i];
var fakeMovie = window[movieName];
var realMovie = document.getElementById(movieName);
for(var method in fakeMovie) {
realMovie[method] = function() {
flashFunction = "<invoke name=\"" + method.toString() + "\" returntype=\"javascript\">" + __flash__argumentsToXML(arguments, 0) + "</invoke>";this.CallFunction(flashFunction);
}
}
window[movieName] = realMovie;
}
}
</script>
플래쉬를 표시하기 전 아래의 자바스크립트를 실행한다.
<script type="text/javascript">
//<![CDATA[var eim = new ExternalInterfaceManager();
eim.registerMovie("flashID");
eim.initialize();
//]]>
</script>
위의 방법보다 간단한 방법이라 소개된 자료
function Flash(id, url, width, height)
{
var str;
str = '<object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" codebase="http://fpdownload.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=8,0,0,0" width="' + width + '" height="' + height + '" id="' + id + '" align="middle">';
str += '<param name="allowScriptAccess" value="sameDomain" />';
str += '<param name="movie" value="' + url + '" /><param name="quality" value="high" /><param name="bgcolor" value="#ffffff" />';
str += '<embed src="' + url + '" quality="high" bgcolor="#ffffff" width="' + width + '" height="' + height + '" id="'+ id +'" name="' + id + '" align="middle" allowScriptAccess="sameDomain" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" />';
str += '</object>';
document.write(str);
//Flash의 ExternalInterface가 Form Tag내에서 오류나는 버그를 해결하는 코드
eval("window." + id + " = document.getElementById('" + id + "');");
}