AIR での HTML コピー&ペースト

Adobe AIR 1.0 およびそれ以降

Adobe AIR の HTML 環境では、コピー&ペーストに関して独自のイベントとデフォルト動作が提供されています。アプリケーションサンドボックス内で実行するコードのみが、AIR の Clipboard.generalClipboard オブジェクトを通して、システムクリップボードに直接アクセスできます。非アプリケーションのサンドボックス内の JavaScript コードは、HTML ドキュメントのエレメントから送出されたコピーイベントまたはペーストイベントのいずれかに応答して送出されるイベントオブジェクトを通して、クリップボードにアクセスできます。

コピー&ペーストイベントには、 copy cut paste などがあります。これらのイベントに対して送出されるオブジェクトでは、 clipboardData プロパティを使用してクリップボードにアクセスできます。

デフォルト動作

デフォルトでは、AIR は、コピーコマンドに応答して選択されたアイテムをコピーします。コピーコマンドは、キーボードショートカットまたはコンテキストメニューによって生成されます。編集可能な領域では、AIR はカットコマンドに応答してテキストをカットするか、またはペーストコマンドに応答してカーソル位置または選択位置にテキストをペーストします。

デフォルトの動作を実行しないようにするには、送出されたイベントオブジェクトの preventDefault() メソッドを、イベントハンドラーで呼び出します。

イベントオブジェクトの clipboardData プロパティの使用

コピーイベントまたはペーストイベントのいずれかの結果として送出されるイベントオブジェクトの clipboardData プロパティを使用すると、クリップボードのデータを読み書きできます。

コピーイベントまたはカットイベントの処理時にクリップボードに書き込むには、 clipboardData オブジェクトの setData() メソッドを使用し、コピーするデータと MIME タイプを渡します。

function customCopy(event){ 
    event.clipboardData.setData("text/plain", "A copied string."); 
}

ペーストされるデータにアクセスするには、 clipboardData オブジェクトの getData() メソッドを使用し、データ形式の MIME タイプを渡します。使用できる形式は、 types プロパティによって通知されます。

function customPaste(event){ 
    var pastedData = event.clipboardData("text/plain"); 
}

getData() メソッドと types プロパティには、 paste イベントから送出されるイベントオブジェクト内でのみアクセスできます。

次の例では、デフォルトのコピー&ペースト動作を HTML ページでオーバーライドする方法を示します。 copy イベントハンドラーは、コピーされるテキストをイタリック体にして、HTML テキストとしてクリップボードにコピーします。 cut イベントハンドラーは、選択されたデータをクリップボードにコピーし、ドキュメントからデータを削除します。 paste ハンドラーは、クリップボードの内容を HTML として挿入し、さらに挿入部分のスタイルを太字にします。

<html> 
<head> 
    <title>Copy and Paste</title>             
    <script language="javascript" type="text/javascript"> 
        function onCopy(event){ 
            var selection = window.getSelection(); 
            event.clipboardData.setData("text/html","<i>" + selection + "</i>"); 
            event.preventDefault(); 
        } 
 
        function onCut(event){ 
             var selection = window.getSelection(); 
             event.clipboardData.setData("text/html","<i>" + selection + "</i>"); 
             var range = selection.getRangeAt(0); 
             range.extractContents(); 
             
            event.preventDefault(); 
        } 
 
        function onPaste(event){ 
            var insertion = document.createElement("b"); 
            insertion.innerHTML = event.clipboardData.getData("text/html"); 
             var selection = window.getSelection(); 
             var range = selection.getRangeAt(0); 
             range.insertNode(insertion); 
            event.preventDefault(); 
        } 
    </script> 
</head> 
<body onCopy="onCopy(event)" 
     onPaste="onPaste(event)" 
     onCut="onCut(event)"> 
<p>Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium  
doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore  
veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam 
voluptatem quia voluptas sit aspernatur aut odit aut fugit, sed quia consequuntur  
magni dolores eos qui ratione voluptatem sequi nesciunt.</p> 
</body> 
</html>