IE10 以降では、Document.execCommand() メソッドによる「cut」コマンドと「copy」コマンドのサポートが追加されました。Chrome バージョン 43 以降、これらのコマンドは Chrome でもサポートされています。
これらのコマンドの実行時にブラウザで選択されたテキストは、切り取られるか、ユーザーのクリップボードにコピーされます。これにより、テキストの一部を選択してクリップボードにコピーする簡単な方法をユーザーに提供できます。
これは、Selection API と組み合わせてプログラムでテキストを選択し、クリップボードにコピーされる内容を決定すると非常に便利です。これについては、この記事の後半で詳しく説明します。
簡単な例
たとえば、メールアドレスをユーザーのクリップボードにコピーするボタンを追加してみましょう。
メール アドレスを HTML に追加し、クリックしたときにコピーを開始するボタンを追加します。
<p>Email me at <a class="js-emaillink" href="mailto:matt@example.co.uk">matt@example.co.uk</a></p>
<p><button class="js-emailcopybtn"><img src="./images/copy-icon.png" /></button></p>
次に、JavaScript で、js-emaillink
アンカーからメールアドレスのテキストを選択するボタンにクリック イベント ハンドラを追加します。次に、メールアドレスがユーザーのクリップボードに記録されるようにコピーコマンドを実行します。次に、メールアドレスの選択を解除してユーザーに選択が行われないようにします。
var copyEmailBtn = document.querySelector('.js-emailcopybtn');
copyEmailBtn.addEventListener('click', function(event) {
// Select the email link anchor text
var emailLink = document.querySelector('.js-emaillink');
var range = document.createRange();
range.selectNode(emailLink);
window.getSelection().addRange(range);
try {
// Now that we've selected the anchor text, execute the copy command
var successful = document.execCommand('copy');
var msg = successful ? 'successful' : 'unsuccessful';
console.log('Copy email command was ' + msg);
} catch(err) {
console.log('Oops, unable to copy');
}
// Remove the selections - NOTE: Should use
// removeRange(range) when it is supported
window.getSelection().removeAllRanges();
});
ここでは、Selection API のメソッド window.getSelection() を使用して、テキストの「選択」をアンカー(ユーザーのクリップボードにコピーするテキスト)に設定します。document.execCommand() を呼び出した後、window.getSelection().removeAllRanges() を呼び出すと、選択を削除できます。すべてが想定どおりに機能したことを確認するには、document.execCommand(); のレスポンスを調べて、コマンドがサポートされていないか有効になっている場合は false を返します。いくつかのシナリオでは「cut」コマンドと「copy」コマンドがエラーをスローする可能性があるため、execCommand() は try and catch でラップします。
「cut」コマンドは、テキスト コンテンツを削除してクリップボードからアクセス可能なテキスト フィールドに使用します。
HTML でテキスト領域とボタンを使用する:
<p><textarea class="js-cuttextarea">Hello I'm some text</textarea></p>
<p><button class="js-textareacutbtn" disable>Cut Textarea</button></p>
コンテンツをカットする手順は次のとおりです。
var cutTextareaBtn = document.querySelector('.js-textareacutbtn');
cutTextareaBtn.addEventListener('click', function(event) {
var cutTextarea = document.querySelector('.js-cuttextarea');
cutTextarea.select();
try {
var successful = document.execCommand('cut');
var msg = successful ? 'successful' : 'unsuccessful';
console.log('Cutting text command was ' + msg);
} catch(err) {
console.log('Oops, unable to cut');
}
});
queryCommandSupported
、queryCommandEnabled
document.execCommand()
を呼び出す前に、document.queryCommandSupported() メソッドを使用してこの API がサポートされていることを確認する必要があります。上記の例では、サポートに基づいて次のようにボタンの無効化状態を設定できます。
copyEmailBtn.disabled = !document.queryCommandSupported('copy');
document.queryCommandSupported() と document.queryCommandEnabled() の違いは、切り取りとコピーはブラウザでサポートされていても、現在テキストが選択されていない場合、有効にならないことです。これは、テキストの選択をプログラムで設定せずに、コマンドが想定どおりに実行されるようにし、設定しない場合はユーザーにメッセージを表示する場合に便利です。
対応ブラウザ
IE 10 以降、Chrome 43 以降、Firefox 41 以降、Opera 29 以降で、これらのコマンドがサポートされています。
Safari ではこれらのコマンドはサポートされていません。