파일다운로드에 따른 플래쉬 링크 에러
데꾸벅 플래쉬 때문에 난관에 봉착하다 (쉿~ 댐~..)
같은 페이지내 파일다운로드 링크를 클릭후 플래쉬의 링크를 클릭하면 다음과 같이
"을(를) 다운로드 할 수 없습니다 지정되지 않은 오류입니다"라는 메세지(IE7)를 만났다.
이런 황당한 경우는 처음이라..
그냥 일반 링크를 getURL("URL주소");를 직접사용하면 상관이 없으나 getURL("javascript:자바스크립트함수()"); 로 호출하면 다음과 같은 에러를 만나게 된다.
문제는 flash player9 로 업데이트 되면서 보안이 강화됐기 때문이란다.. ㅡ.,ㅡ;
adobe가 flash를 framework로 밀기로 작정을 하면서 부터 player업그레이들 하기 싫더라니...
살재 getURL("javascript:alert(1111);");은 브라우저의 주소표시줄에 javascript:alert(1111); 을 친것과 마찬가지 효과를 가진다. 그러나 보안이 강화되면서 이것 또한 막히면서 호출이 되지 않는다.
아래에서 자세히 설명하겠지만 ExternalInterface.call은 actionscript2.0 부터 지원하게 되므로 publishing할때 반드시 actionscript2 를 선택해줘야 한다.
[IE7 에러메세지]
[IE6 에러메세지]
IE6에서는 "보안을 위해 Internet Explorer가 이 사이트에서 사용자의 컴퓨터로 파일을 다운로드하는 것을 차단했습니다. 옵션을 보려면 여기를 클릭하십시오."라는 메세지를 뱉어내네.. ㅡ.,ㅡ; 써글것들...
그레이트김 차장님의 블로그에 처음 포스팅된 글을 볼때만 해도 단순 다운로드 서블릿의 문제일거라 생각했는데 일반 파일을 다운로드후 테스트해도 동일한 결과가 나왔다.
각각 버전별 플래쉬로 다시 퍼블리싱하여 테스트한 결과 Flash8로 퍼블리싱한 것/Flash Player9 만 문제를 일으킨다는것도..
해결책1 :
다운로드 받을때 타겟을 _blank로 잡으면 된다는것...
_top, _self, 다 해봤지만 _blank가 가장 낫다는거.. 다만 IE7 이전 버전의 경우 새창이 떠서 문제가 되지만... ㅡ.,ㅡ; 근본적인 문제해결법은 아닌것 같다.
해결책 2 :
아래와 같이 ExternalInterface.call("외부스크립트메쏘드명","파라미터명");을 쓴다. 단 아래 빨간색으로 표시된 부분만 주의해주시길...
HTML소스
<head>
<meta http-equiv="Content-Type" content="text/html; charset=euc-kr" />
<title>lodging_menu</title>
<script type="text/javascript">
function techbugJSFunc(codeStr){
alert(codeStr);
}
</script>
</head>
<body bgcolor="#ffffff">
<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="213" height="592" id="lodging_menu" align="middle">
<param name="allowScriptAccess" value="always" /> 반드시 always로 해주세요.. sameDomain도 안되네요
<param name="movie" value="techbug.swf" />
<param name="quality" value="high" />
<param name="bgcolor" value="#ffffff" />
<embed src="techbug.swf" quality="high" bgcolor="#ffffff" width="213" height="592" name="techbug" align="middle"
allowScriptAccess="always" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" />
</object>
</body>
</html>
ActionScript
link = new Array();
link[1] = "LDG_A00000";
link[2] = "LDG_A01000";
link[3] = "LDG_A02000";
link[4] = "LDG_B00000";
link[5] = "LDG_E00000";
link[6] = "LDG_F00000";
link[7] = "LDG_I00000";
link[8] = "GDE_G00000";
link[9] = "LDG_H00000";
frame = new Array();
frame[1] = "_self";
frame[2] = "_self";
frame[3] = "_self";
frame[4] = "_self";
frame[5] = "_self";
frame[6] = "_self";
frame[7] = "_self";
frame[8] = "_self";
frame[9] = "_self";
numOfMenu = 12 ;
defaultY = 17 ;
max = new Array(0,0,0,0,0,0, 0) ;
_global.active = pageNum ;
_global.subActive = subNum ;
_global.over = active ;
for(i=1 ; i<= numOfMenu ; i++ ) {
this["menu"+i].defaultY = this["menu"+i]._y ;
this["menu"+i].bg.onRollOver = function() {
_global.over = this._parent._name.substring(4) ;
};
this["menu"+i].bg.onRollOut = this["menu"+i].bg.onDragOut = function() {
_global.over = active ;
};
if(i != numOfMenu) {
this["menu"+i].bg.onRelease = function() {
import flash.external.*;
ExternalInterface.call("techbugJSFunc",link[this._parent._name.substring(4)]);
//getURL(link[this._parent._name.substring(4)], frame[this._parent._name.substring(4)]);
};
}
this["menu"+i].bg._height = defaultY ;
if(i != 1) {
this["menu"+i]._y = this["menu"+i-1].bg._height + this["menu"+i-1]._y ;
}
this["menu"+i].onEnterFrame = function() {
if(over == this._name.substring(4)) {
this.direction = "next" ;
this.nextFrame() ;
} else {
this.direction = "prev" ;
this.prevFrame() ;
}
if(Number(this._name.substring(4)) > over) {
this._y += (this.defaultY + max[over -1] - this._y) / 4 ;
} else {
this._y += (this.defaultY - this._y) / 4 ;
}
if(this._name.substring(4) != numOfMenu) {
this.bg._height = this._parent[Number(this._name.substring(4)) + 1]._y - this._y + 10;
} else {
this.bg._height = 400;
}
};
}
this[numOfMenu].bg.useHandCursor = false;
또한 FlashPlayer9에서 <form>태그내에서 쓸때 버그를 해결하기 위해서는 다음과 같이 작성한다.
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 + "');");
}
이달(2008.4월말)에 다시 보안 업뎃 된다는데 어케 바뀔지는 두고봐야 게따.. 다시 바꿀일이 없길 바라믄서...
[스크립트에서 Flash9 에러방지 ]
// 새로고침시 Flash9 ocx 에러 방지
window.onbeforeunload= function() {
deconcept.SWFObjectUtil.prepUnload();
}
/*ExternalInterface 관련 함수 시작*/
function cleanup() {
__flash_unloadHandler = function() {
externalProbSet = true;
obj = document.getElementsByTagName('OBJECT');
for (i=0;i<obj.length;i++) {
var theObj = eval(obj[i]);
theObj.style.display = "none";
for (var prop in theObj) {
if (typeof(theObj[prop]) == "function") {
theObj[prop]=null
}
}
}
}
if (window.onunload != __flash_unloadHandler) {
__flash_savedUnloadHandler = window.onunload;
window.onunload = __flash_unloadHandler;
}
}
window.onbeforeunload=cleanup;
/*ExternalInterface 관련 함수 끝*/
'Designer > FLASH & FLEX' 카테고리의 다른 글
IE7 / FF / Opera FLASH getURL 보안창뜰때 (0) | 2008.03.12 |
---|---|
드디어 Adobe AIR v1.0 & Flex3.0 릴리즈 (2) | 2008.02.26 |