トップ «前の日記(2009-04-01) 最新 次の日記(2009-04-04)» 編集

Ussy Diary


2009-04-03

[Flash]swfobject を使ってクリップボードにコピー

Flash を数年ぶりに触った。 ActionScript といった方が正しいのかも。

ボタンをクリックしたところで、 HTML の input 要素に入っている文字列をクリップボードにコピーさせたいので Flash を触ってみる。

クリップボードにコピーするには ActionScript の ExternalInterface.call から JavaScript の関数を呼び出し、 document.getElementById して value の文字列を返したものを ActionScript の System.setClipboard に設定してあげるだけ。

clipboard.mxml

<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" creationComplete="creationCompleteHandler(event)" layout="absolute">
    <mx:Script>
        <![CDATA[
            import flash.events.Event;
            import flash.external.ExternalInterface;

            private function creationCompleteHandler(e:Event) :void {
                copy.label = Application.application.parameters.label || "copy";
            }

            private function buttonClickHandler(e:Event) :void {
                var callback:String = Application.application.parameters.callback;
                var value:String = ExternalInterface.call(callback);
                System.setClipboard(value);
            }
        ]]>
    </mx:Script>
    <mx:Button id="copy" click="buttonClickHandler(event)" />
</mx:Application>

clipboard.html 抜粋

   <input id="text" value="hoge" />
   <div id="copy" />
   <script type="text/javascript" src="swfobject.js"></script>
   <script type="text/javascript">
     function getText() {
       return document.getElementById('text').value;
     }

     swfobject.embedSWF("clipboard.swf", "copy", "100%", "100%", "9.0.0", "expressInstall.swf", {"callback": "getText", "label": "コピー"}, {}, {});
   </script>

うまく動くと思ったけど Flash 10 で swfobject を使う、かつ ExternalInterface を利用する場合は trunk から 2.2 を持ってこないといけないことが分からなくて時間を無駄に過ごしました。

なお IDE には FlashDevelop を利用させてもらいました。