최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday

티스토리 뷰

   플래시와 Javascript를 통신하는 통신 클래스 & 함수가 크롬에서는 안된다.


AS3.0의 ExternalInterface 클래스와 AS2.0의 getURL(), setVariables() 함수는


IE, FireFox, Opera, Safari 브라우저에서 Local 로 동작 가능함을 직접 확인하였다.


그런데 문제는 유독 Chrome에서 정의되지 않은 함수 (undefined function) 라며 에러를 낸다.


이런경우 대게 소스상의 문제는 아니고 브라우저 설정이나 속성의 문제다.



   해결 방법


검색해 보니 다른 분들도 이런 경험이 적잖이 있었던것 같은데 본인은 이 방법으로 해결 하였기 때문에


그 해결 방법 중 하나가 되기를 바란다.



1. 서버에서 구동 (다소 번거로움)


APM이나 IIS에 올려놓고 테스트 해 보면 에러는 사라진다. 


마치 IE에서 전역보안 설정처럼 로컬에서 이들 클래스와 함수가 차단되어진 것일까?



2. 크롬 플러그인 설정에서 해결


   ㄱ. Chorme에서 URL에  chrome://plugins/  를 입력한다.


   ㄴ. 우측 상단에 [+]세부정보를 클릭한다.

   

   ㄷ. 항목 중 Adobe Flash Player를 찾아보면 적게는 두개, 많게는 3개의 Flash Player plugin이 중첩되어있다.


       유형 : PPAPI 라는 외부엔진은 '사용 중지'를 클릭하여 정지 시킨다.


       유형 : NPAPI실행되도록 해둔다.


   ㄹ. 마무리로 NPAPI에 v 항상 허용을 체크 해 준다.


   ㅁ. 열려있는 모든 탭을 닫고 재실행.


( ㄷ,ㄹ은 하단의 그림을 참조)




   ExternalInterface를 사용한 예제


기능은 플래시 안에 있고, javascript같은 외부 함수에서 호출하는 예제이다.


http://serpiko.meximas.com/FLASHS/EXTERNAL/ovlivion/Main.html




   예제소스


ExternalInterface.addCallback은 자주 쓰이지는 않지만 매우 유용하게 사용되므로 소스를 남겨두도록 한다.


Main.as


package  {
	
	import caurina.transitions.Tweener;
	import caurina.transitions.properties.ColorShortcuts;
	ColorShortcuts.init();
	
	import flash.display.Sprite;
	import flash.display.MovieClip;
	import flash.external.ExternalInterface;
	import flash.events.MouseEvent;
	
	[SWF(frameRate="30", width="550", height="400", backgroundColor="0x000000")];
	
	public class Main extends Sprite{
		
		private var _itemLen:int;
		private var _isBool:Boolean;
		private var _count:int = 0;
		
		private var _index1:int;
		private var _index2:int;
		private var _xposArr:Array = [0, 485];
		
		public function Main() {
			super();
			init();
		}
		
		private function init():void{
			_itemLen = container_mc.numChildren; //6
			ExternalInterface.addCallback("getJavaScript1", function():void{ recive1() });
			ExternalInterface.addCallback("getJavaScript2", function():void{ recive2() });
		}
		
		protected function recive1():void{
			_isBool = !_isBool;
			_isBool ? _index1 = 1 : _index1 = 0;

			for(var i:int=0; i<_itemLen; ++i){
				var icon:MovieClip = container_mc["img"+i] as MovieClip;
				Tweener.addTween(icon,{ x:_xposArr[_index1], time:1.5, delay:0.1 * i,  transition:"easeOutExpo" });
			}
			
			log("flash X moving");
		}
		
		protected function recive2():void{
			_count++;
			_count % 2 == 1 ? _index2 = 1 : _index2 = 0;
			
			var topPosition:uint = bg_mc.numChildren - 1;
			var bg_img:MovieClip = bg_mc["img"+_index2];
			
    		bg_mc.setChildIndex( bg_img, topPosition);
			
			bg_img.alpha = 0;
			Tweener.addTween(bg_img,{ alpha:1, time:1.5, transition:"easeOutExpo" });
			
			log("flash BG fade");
		}

		internal function log($str):void{
			ExternalInterface.call("log", $str);
		}
	}
}


Main.html


<!DOCTYPE html>
<head>
<style type="text/css">
	* {padding:5;margin:5;}
</style>


<!-- 플래시 오브젝트 -->
<script type="text/javascript" src="js/jquery-2.0.3.min.js"></script>
<script type="text/javascript" src="js/swfobject.js"></script>
<script language="javascript">

/*******************
 * id 가 $id인 swf의 sendToActionScript로 value를 보낸다. ④
********************/
function sendToActionScript1($id){
	thisMovie($id).getJavaScript1(); // ⑥
}

function sendToActionScript2($id){
	thisMovie($id).getJavaScript2(); // ⑥
}

function thisMovie(movieName) {
	if (navigator.appName.indexOf("Microsoft") != -1) return window[movieName];
	else return document[movieName];
}

function log($obj){
	console.log($obj.log);
}

function outputStatus(e) { // callBack
	//alert("e.success = " + e.success +"\ne.id = "+ e.id +"\ne.ref = "+ e.ref);
}
</script>
</head>
<body>

<div id="mainFlashDIV"></div>
<br />
<input type='button' id="btn1" value='아이콘 이동' />
<input type='button' id="btn2" value='배경 전환' />

<script>
	$(document).ready(function() {
		var flashvars = {};
		flashvars.name1 = 'hello';
		flashvars.name2 = 'world';
		flashvars.name3 = 'foobar';

		var param = {};
		param.menu = "false";
		param.allowScriptAccess = "always";
		param.fullScreen = "false";
		param.scale = "noscale";
		param.bgcolor = "#000000";
		param.loop = "false";
		param.quality = "high"
		param.wmode = "window";

		var attributes = {};
		attributes.align = "top";
		attributes.id = "mainFlash_id";
		attributes.name = "mainFlash_id";

		//swfobject.embedSWF("myContent.swf", "myContent", "300", "120", "9.0.0"); // lite
		swfobject.embedSWF("Main.swf", "mainFlashDIV", "550", "400", "9.0.0", "expressInstall.swf", flashvars, param, attributes, outputStatus);

		$("#btn1").click(function(){
			//sendToActionScript1("mainFlash_id");
			thisMovie('mainFlash_id').getJavaScript1();

		});

		$("#btn2").click(function(){
			sendToActionScript2("mainFlash_id");

		});

	});
	
</script>

</body>
</html>



sousrce : http://goppa.tistory.com/entry/Chrome%EC%9C%BC%EB%A1%9C-Local-%EC%83%81%EC%97%90%EC%84%9C-ExternalInterface-%EC%B0%A8%EB%8B%A8-%EB%AC%B8%EC%A0%9C%ED%95%B4%EA%B2%B0


original source : http://krpano.com/forum/wbb/index.php?page=Thread&threadID=8254

댓글