ブラウザでダウンロード swf 内でクリックを受け付けるおそらく、クリップボードの悪用の対処と思われる現象によって、Flash 10 で JavaScript からアクセスしたクリップボードへの書き込みが エラー #2176 によって拒否されます。(内部の初期処理イベントでもエラーになります) よって、いままでのような呼び出し方をやめて、swf をボタンとして使う 事によって従来通りの処理を可能にします --------------------------------------------------------------------------- ● .mxml を使用せずに .as を使用しているのは、 出来上がるファイルが格段に小さくなるからです ● MOUSE_OVER と MOUSE_OUT は使用していませんが、今後の為に実装してあります 以下のコードにはデバッグの為、firebug が組み込まれていますが、 クリップボード機能の実装には必要ありません。 package { import flash.display.*; import flash.events.*; import flash.system.*; import flash.external.*; import flash.net.*; public class UrlImage extends Sprite { private var funcName:String; // ********************************************************* // コンストラクタ // ********************************************************* public function UrlImage(URL:String,func:String):void { funcName = func; var loader:Loader = new Loader(); // 読み込み完了イベントを登録 loader.contentLoaderInfo.addEventListener(Event.COMPLETE, loadComplete); // 読み込み loader.load(new URLRequest(URL)); firebug("UrlIamge start"); } // ********************************************************* // 読み込み完了イベント // ********************************************************* private function loadComplete(e:Event):void { // ロードされたオブジェクトをメインの Sprite に追加 addChild(e.target.loader); // 配置( 左詰め、上 ) stage.align = StageAlign.TOP_LEFT; // 伸縮モード( そのまま ) stage.scaleMode = StageScaleMode.NO_SCALE; // クリックイベントを登録 this.addEventListener(MouseEvent.CLICK, mouseClick); // ボタン互換モード(マウスが上に来た時ハンドカーソル) this.buttonMode = true; this.addEventListener(MouseEvent.MOUSE_OVER , mouseOver); this.addEventListener(MouseEvent.MOUSE_OUT, mouseOut); firebug("loadComplete(LoaderInfo)"); } // ********************************************************* // クリックイベント // ********************************************************* private function mouseClick(e:MouseEvent):void { try { var ret:String = ExternalInterface.call( funcName ); if ( ret != "" ) { System.setClipboard(ret); } } catch(e:Error) { firebug(e.message); } firebug("mouseClick:"+ret); } // ********************************************************* // マウスイベント // ********************************************************* private function mouseOver(e:MouseEvent):void { firebug("MOUSE_OVER"); } private function mouseOut(e:MouseEvent):void { firebug("MOUSE_OUT"); } // ********************************************************* // ログ表示 // ********************************************************* public function firebug(data:Object):void { ExternalInterface.call( "console.log", data+"" ); } } } package { import flash.display.*; // SWF の背景色(黒) [SWF(backgroundColor="#000000")] // 表示用クラス 【Sprite】を継承 public class Main extends Sprite { // ********************************************************* // コンストラクタ // ********************************************************* public function Main():void { var param:Object = loaderInfo.parameters; var func:String = param['func']; var ui:UrlImage = new UrlImage("clipb.png",func); addChild(ui); ui.firebug("Main start"); } } } HTML側の記述HTML 側が呼ばれる事になるので、SWF に対して呼ばれる関数名を渡します。 このパッケージでは、画像は固定で clipb.png ですが、ビルドしなおせば 好きな場所の好きなファイル名に変更できます。 画像のサイズに合わせて、SWF の記述を行い、実装する DIV を使って廻りを 線で囲っています。 JavaScript の関数では、IE の場合は、IE の機能を使ってコピーし、 その場合は、空文字を返して SWF 内の処理をキャンセルします。 IE 以外の場合は、クリップボードにコピーして欲しい文字列を return しています。 この仕様に沿って、メッセージボックスの表現は、「〜します」にしています。 ( 自然と、キャンセルの記述も行えるでしょう ) <HTML> <HEAD> <META http-equiv="Content-type" content="text/html; charset=Shift_JIS"> <TITLE>WEB Flex のテスト</TITLE> <STYLE type="text/css"> * { font-family: "MS Pゴシック"; font-size: 12px; } BODY { background-color: white; color: black; } </STYLE> <SCRIPT language="javascript" type="text/javascript" src="swfobject.js"> </SCRIPT> <SCRIPT language="javascript" type="text/javascript"> function GetText() { alert("クリップボードにコピーします ") if (window.navigator.userAgent.toLowerCase().indexOf("msie") > -1) { window.clipboardData.setData('text', "クリップボード(IE)"); } else { return "クリップボード(Flash)"; } } </SCRIPT> </HEAD> <!-- ******************************************************* BODY ******************************************************** --> <BODY> <div id="flashcontent" style='width:70;border-style:solid;border-color:gray;border-width:1px;'></div> <script type="text/javascript"> var so = new SWFObject( "setClipboard.swf?reload=" + (new Date()).getTime(), "id_sample", "70", "12", "9"); so.addVariable( "func", "GetText" ); so.write("flashcontent"); </script> </BODY> </HTML> |