BLOG main image
분류 전체보기 (117)
Hidden (1)
five senses (0)
safe system (77)
code (35)
database (1)
Link (0)
Visitors up to today!
Today hit, Yesterday hit
daisy rss
tistory 티스토리 가입하기!
2008. 12. 9. 05:00


보통 호출 방법
// 플래시 내부 함수 호출
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 + "');");
}