JavaScriptでWebブラウザのクリップボード API navigator.clipboard.writeText()
を使用してクリップボードにテキストをコピーする方法を紹介します。
また、ブラウザがクリップボード APIに対応していない場合の対応策も紹介してます。
クリップボード APIでクリップボードにテキストをコピーする
【サンプル】クリップボード APIでクリップボードにテキストをコピー
「コピー」ボタンをクリックするとテキストをコピーできます。
クリップボードにコピーできているか確認したい場合は、下記に貼り付けてください。
【実装コード】クリップボード APIでクリップボードにテキストをコピー
<div class="copy-box">
<div id="js-copy-txt" class="copy-txt">このテキストをクリップボードにコピー</div>
<button id="js-copy-btn" class="copy-btn">コピー</button>
</div>
.copy-box {
display: flex;
column-gap: 10px;
}
.copy-btn {
padding: 0.2em 0.8em;
color: #fff;
background: #fdbe71;
border: none;
border-radius: 3px;
cursor: pointer;
}
let copyBtn = document.getElementById('js-copy-btn');
copyBtn.addEventListener('click', click_copy_btn, false);
function click_copy_btn() {
//コピーするテキストを取得
let getTxt = document.getElementById('js-copy-txt').innerText;
//取得したテキストをクリップボードに書き込み
navigator.clipboard.writeText(getTxt);
}
navigator.clipboard.writeText()
は、基本的にほとんどのモダンブラウザで対応してますが、比較的最近実装されたAPIのため古いブラウザで対応してない場合があります。
navigator.clipboard.writeText()
のブラウザの互換性についてはこちらからご確認ください。
ブラウザがクリップボード APIに対応していない場合の対応策
navigator.clipboard.writeText()
が効かない場合、現在非推奨になっているexecCommand('copy')
を使用することで、対応可能な場合があります。
execCommand('copy')
はブラウザが提供する編集可能な要素(<textarea></textarea>
など)のテキストをクリップボードにコピーすることができます。
非推奨になった理由
セキュリティ上の懸念
execCommand('copy')
はJavaScriptから直接クリップボードにアクセスすることができます。そのため、悪意あるスクリプトがユーザーのクリップボードの内容を読み取ることができるというセキュリティ上の脆弱性があります。ブラウザの互換問題
execCommand('copy')
は全てのブラウザで互換性があるわけではなく、一部ブラウザで使用できない場合があります。非標準
execCommand()
自体が非標準のAPIであり、W3Cの公式な仕様として定義されていません。ブラウザ間での挙動の統一性がなく、互換性や安定性の問題が生じる可能性があります。代替手段の登場
新しいクリップボードAPInavigator.clipboard.writeText()
が導入され、クリップボードへのアクセスを制御し、安全性が向上してます。
【サンプル】execCommand('copy')でクリップボードにテキストをコピー
「コピー」ボタンをクリックするとテキストをコピーできます。
クリップボードにコピーできているか確認したい場合は、下記に貼り付けてください。
【実装コード】execCommand('copy')でクリップボードにテキストをコピー
execCommand('copy')
は、ブラウザが提供する編集可能な要素(<textarea></textarea>
など)にテキストが記載されている必要があります。
そのため、今回の実装コードではJavaScriptで一時的に<textarea>
タグを作成して、クリップボードにテキストをコピーします。
<div class="copy-box">
<div id="js-copy-txt2" class="copy-txt">このテキストをクリップボードにコピー</div>
<button id="js-copy-btn2" class="copy-btn">コピー</button>
</div>
.copy-box {
display: flex;
column-gap: 10px;
}
.copy-btn {
padding: 0.2em 0.8em;
color: #fff;
background: #fdbe71;
border: none;
border-radius: 3px;
cursor: pointer;
}
let copyBtn2 = document.getElementById('js-copy-btn2');
copyBtn2.addEventListener('click', click_copy_btn2, false);
function click_copy_btn2() {
//コピーするテキストを取得
let getTxt = document.getElementById('js-copy-txt2').innerText;
//textareaを一時的に作成してテキストを設定
let textarea = document.createElement('textarea');
textarea.value = getTxt;
//textareaをDOMに追加
document.body.appendChild(textarea);
//textareaを選択してクリップボードにコピー
textarea.select();
document.execCommand('copy');
//textareaを削除
document.body.removeChild(textarea);
}
個人メモ
コピーボタンの上に「コピー完了」の吹き出しを表示する
【サンプル】コピーボタンの上に「コピー完了」の吹き出しを表示
【実装コード】コピーボタンの上に「コピー完了」の吹き出しを表示
<div class="copy-box">
<div id="js-copy-txt3" class="copy-txt">このテキストをクリップボードにコピー</div>
<button id="js-copy-btn3" class="copy-btn">コピー</button>
</div>
.copy-box {
display: flex;
column-gap: 10px;
}
.copy-btn {
padding: 0.3em 0.8em;
color: #fff;
background: #fdbe71;
border: none;
border-radius: 3px;
cursor: pointer;
position: relative;
}
.copy-btn::before {
content: 'コピー完了';
width: 7em;
padding: 0.3em 0;
text-align: center;
font-size: 13px;
background: #555;
border-radius: 5px;
opacity: 0;
position: absolute;
top: calc(-100% - 6px);
right: 0;
pointer-events: none;
z-index: 3;
}
.copy-btn::after {
content: '';
width: 8px;
height: 8px;
background: #555;
opacity: 0;
position: absolute;
top: calc(-100% + 17px);
right: 8px;
transform: rotate(45deg);
pointer-events: none;
z-index: 2;
}
.copy-btn.-add-fukidashi::before,
.copy-btn.-add-fukidashi::after {
opacity: 1;
}
let copyBtn3 = document.getElementById('js-copy-btn3');
copyBtn3.addEventListener('click', click_copy_btn3, false);
let fukidashiTimer;
function click_copy_btn3() {
//コピーするテキストを取得
let getTxt = document.getElementById('js-copy-txt3').innerText;
//取得したテキストをクリップボードに書き込み
navigator.clipboard.writeText(getTxt);
//js-copy-btn3に吹き出しを表示するためのclassを追加
if (copyBtn3.classList.contains('-add-fukidashi')) {
copyBtn3.classList.remove('-add-fukidashi');
copyBtn3.classList.add('-add-fukidashi');
//前回のタイマーをクリア
clearTimeout(fukidashiTimer);
fukidashiTimer = setTimeout(function () {
copyBtn3.classList.remove('-add-fukidashi');
}, 2000);
} else {
copyBtn3.classList.add('-add-fukidashi');
fukidashiTimer = setTimeout(function () {
copyBtn3.classList.remove('-add-fukidashi');
}, 2000);
}
}
クリップボード APIが使用できるかJavaScriptで確認(判定)する
【サンプル】クリップボード APIが使用できるかJavaScriptで確認
【実装コード】クリップボード APIが使用できるかJavaScriptで確認
<div class="copy-box">
<div id="js-copy-txt4" class="copy-txt">このテキストをクリップボードにコピー</div>
<button id="js-copy-btn4" class="copy-btn">コピー</button>
</div>
.copy-box {
display: flex;
column-gap: 10px;
}
.copy-btn {
padding: 0.2em 0.8em;
color: #fff;
background: #fdbe71;
border: none;
border-radius: 3px;
cursor: pointer;
}
let copyBtn4 = document.getElementById('js-copy-btn4');
copyBtn4.addEventListener('click', click_copy_btn4, false);
function click_copy_btn4() {
if (navigator.clipboard) {
console.log('クリップボード APIが利用可能です。');
} else {
console.log('クリップボード APIは利用できません。');
}
}
HTMLとCSSの知識がありJavaScriptを学びたいという方におすすめの1冊
JavaScriptのフロントエンドエンジニアを目指している方におすすめの1冊
もみじ
この本はJavaScript初心者からフロントエンドエンジニアを目指す方にぴったりの1冊です。
非同期処理やAJAXなど、現代の開発で必要なスキルがわかりやすく解説されており、実務で役立つスキルを学ぶことができます。
もみじ
HTMLとCSSの知識がありJavaScriptを学びたいという方に入門書としておすすめの書籍です。
実務で役立つサンプルを手を動かしながら学ぶことができ、実践的なスキルを身に付けることができます。