Develop!/script, Ajax

파이어 폭스에서도 클립보드 접근하기

체리필터 2006. 11. 1. 21:23
728x90
반응형
회사에서 특정 내용을 클립보드에 복사하는 기능을 만들 필요가 있었는데...
그동안 파폭은 지원이 안된다는 단정하에, 익스에서만 돌아가도록 만들었었다.
그런데 혹시나 하는 맘에 구글링 해 보았더니...
다음과 같은 팁이 나오더라... ㅋ
무단 펌질이라서 -.-;;

##### 펌 내용 시작...

<input type="button" onclick='return copy_clip("클립보드로 복사했습니다.")'> 혹은, MT에선
<input type="button" onclick='return copy_clip("<$MTEntryTrackbackLink$>")'>

무버블타입의 경우 아래의 스크립트를 바로 해당 아카이브 템플릿의 <head>태그 사이에 복사해 넣지 말고, Template Modules 섹션에서 clipboard라는 이름으로 템플릿 모듈을 만든 후에,
적용할 아카이브 템플릿의 <head> 태그 안에서 <MTInclude module="clipboard"> 식으로 사용하는게 낫다. 블록을 오래 운용하다보면 당연히 이런 저런 자바스크립트 모듈을 덧붙이게 되는데 그럴 때 마다 한 메인 아카이브 템플릿에다 복사해 넣는다면 차후 수정시에 곤란을 겪기 쉽다.


<script language="javascript" type="text/javascript">
<!--
function copy_clip(meintext){
if (window.clipboardData)
{

// the IE-manier
window.clipboardData.setData("Text", meintext);

// waarschijnlijk niet de beste manier om Moz/NS te detecteren;
// het is mij echter onbekend vanaf welke versie dit precies werkt:
}
else if (window.netscape)
{

// dit is belangrijk maar staat nergens duidelijk vermeld:
// you have to sign the code to enable this, or see notes below
netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect');

// maak een interface naar het clipboard
var clip = Components.classes['@mozilla.org/widget/clipboard;1'].createInstance(Components.interfaces.nsIClipboard);
if (!clip) return;

// maak een transferable
var trans = Components.classes['@mozilla.org/widget/transferable;1'].createInstance(Components.interfaces.nsITransferable);
if (!trans) return;

// specificeer wat voor soort data we op willen halen; text in dit geval
trans.addDataFlavor('text/unicode');

// om de data uit de transferable te halen hebben we 2 nieuwe objecten nodig om het in op te slaan
var str = new Object();
var len = new Object();

var str = Components.classes["@mozilla.org/supports-string;1"].createInstance(Components.interfaces.nsISupportsString);

var copytext=meintext;

str.data=copytext;

trans.setTransferData("text/unicode",str,copytext.length*2);

var clipid=Components.interfaces.nsIClipboard;

if (!clip) return false;

clip.setData(trans,null,clipid.kGlobalClipboard);

}
alert("반갑습니다.\n" + meintext);
return false;
}
//-->
</script>

가능하면 해석 불가한 주석이라도 지우지 말고 사용하는게 좋을 것 같다.



모 질라, 파이어폭스는 보안이 강화되어서 자바스크립트라 하더라도 그 내용에 따라 기존의 Active-X컨트롤처럼 일종의 권한 허가를 받아야 가능하다고 한다. 이 스크립트의 경우 시스템의 클립보드에 접근하는 것이라 그런지, 이를 실행시키려 하면 시스템 보안에 관한 창이 뜨면서 권한 허가 여부를 묻는다. 당연히 "예" 를 눌러야 복사가 될 것이다.

위 루틴은 복사한 후에 확인창(alert창)을 띄워 주는데 혹 이런 창이 안뜨고 복사만 된다 던지 혹은 정상적인 작동이 안된다 싶을 경우엔, 브라우져의 주소창에 about:config 를 치면 해당 설정 내용이 쭉 나타나는데 그 중에서 Signed.applets.codebase_principal_support 라는 부분을 찾아서 true로 바꿔주면 문제없이 작동할 것이다.


##### 펌 내용 끝...
728x90
반응형