SyntaxHighlighter 用に作成したボタンですが、良く考えるとクリップボードにデータをコピー する以外にも色々使えそうなので汎用化しました。 まず、デフォルトのボタンは埋め込んだ画像を用い、初期化で呼び出される JavaScript(orgCodeInit) が URL を return した場合のみその画像を使うようにしています。 呼び出す JavaScript の関数名は固定で、3つあり、以下のようになります ※ 画像サイズは指定する必要があります wmode="transparent" を使用すると、背景を透過した画像を使用できます ( Firefox では、Flash10 で確認しました ) IE6 で、フルカラーで単に背景を透過した画像を使用したい場合にも利用可能です // ********************************************************* // ボタン画像変更用 // id は、Object の id または Embed の name // return "" で、デフォルトの埋め込みボタンを使用 // ********************************************************* function orgCodeInit(id) { if ( id == 'flashButton' ) { return ""; } if ( id == 'flashButton2' ) { return( "button.png" ); } return ""; } var codeWorkString = ""; // ********************************************************* // クリップボードにコピーさせたい時のみ // id は、Object の id または Embed の name // return で文字列を返す // それ以外ならば処理をして return "" すればよい // shiftFlg ctrlFlg は、押されておれば "1" となる // 通常は "0" // ********************************************************* function orgCodeGetForClipcopy(id,shiftFlg,ctrlFlg) { codeWorkString = document.getElementById(id+"_src").innerHTML; codeWorkString = codeWorkString.replace(/</g,'<') .replace(/>/g,'>') .replace(/&/g,'&'); if (window.navigator.userAgent.toLowerCase().indexOf("msie") > -1) { if ( shiftFlg == "1" ) { window.clipboardData.setData('text', codeWorkString); alert("【IE】 クリップボードにコピーされました "); return ""; } } return( codeWorkString ); } // ********************************************************* // orgCodeGetForClipcopy で retunr "" 以外を実行すると // 呼び出される // ********************************************************* function orgCodeClipcopyEnd() { alert("クリップボードにコピーされました "); } ブラウザでダウンロード flashButton.as// ********************************************************* // 汎用型 クリップボードコピー用 Flash ボタン // ********************************************************* package { import flash.display.*; import flash.events.*; import flash.external.*; import flash.system.*; import flash.net.*; // 表示用クラス 【Sprite】を継承 public class flashButton extends Sprite { [Bindable] [Embed("button.gif")] private var imgButton:Class; private var strid:String; // ********************************************************* // コンストラクタ // ********************************************************* public function flashButton():void { // IE:Object の id,それ以外 Embed の name strid = ExternalInterface.objectID; // stage の設定 stage.scaleMode = StageScaleMode.NO_SCALE; stage.align = StageAlign.TOP_LEFT; // マウスイベント取得用 var eventArea:Sprite = new Sprite(); eventArea.x = 0; eventArea.y = 0; eventArea.buttonMode = true; // ハンドカーソル addChild(eventArea); var imgPath:String = ExternalInterface.call( "orgCodeInit", strid ); if ( imgPath == null || imgPath == "" ) { // デフォルトのボタン画像 var myImg:Bitmap = new imgButton(); myImg.x = 0; myImg.y = 0; eventArea.addChild(myImg); } else { var loader:Loader = new Loader(); loader.load(new URLRequest(imgPath)); loader.contentLoaderInfo.addEventListener(Event.COMPLETE, function ():void { eventArea.addChild( loader ); } ); } eventArea.addEventListener(MouseEvent.CLICK, function(ev:flash.events.MouseEvent):void { var shift_flg:String; var ctrl_flg:String; if ( ev.shiftKey ) { shift_flg = "1"; } else { shift_flg = "0"; } if ( ev.ctrlKey ) { ctrl_flg = "1"; } else { ctrl_flg = "0"; } var str:String = ExternalInterface.call( "orgCodeGetForClipcopy", strid, shift_flg, ctrl_flg ); // 戻された文字列に何か入っていたら // クリップボードにコピーして再び呼び出す if ( str != null && str != "" ) { System.setClipboard(str); ExternalInterface.call("orgCodeClipcopyEnd" ); } // Firebug 用 ExternalInterface.call("console.log", str); } ); } }} |