クリップボードにコピーするボタン(JavaScriptとReact)

クリップボードにコピーするボタン

JavaScriptとReactで作るクリップボードコピーボタン | We.Inc

Clipboard APIのwriteTextでコピーボタンを作ります。動くデモ、Reactフック、ClipboardItemによるリッチなHTMLや画像のコピー、アクセシブルな「コピーしました」通知とエラー処理まで。

クリックハンドラーからnavigator.clipboard.writeText(text)を呼び出します。プロミスを返すので完了を待ち、短い「コピーしました」のメッセージを表示して、エラーの場合も捕捉します。このAPIはHTTPSかlocalhostでしか動かず、クリックのような実際のユーザー操作が必要なので、ページ読み込み時には呼ばないでください。

クリップボードにデータを入れる方法

コピーボタンは簡単そうに見えますが、上位に表示されるスニペットの多くは、うまくいかない部分を省いています。プロミスが拒否されることもあり、埋め込みフレームではブロックされることもあり、スクリーンリーダーの利用者には何が起きたのか伝わりません。下のデモはブラウザーで実際にコピーし、コードはそれぞれのケースに対応しています。

よくある質問

navigator.clipboardが未定義になるのはなぜですか?

ページが安全なコンテキストにないからです。Clipboard APIはHTTPSのページとlocalhostでしか公開されないため、プレーンなHTTPやローカルネットワークのアドレスで配信されたサイトでは使えません。

writeTextがNotAllowedErrorを投げるのはなぜですか?

ブラウザーが書き込みを拒否したためです。多くは、直前のユーザー操作がなかった、ページにフォーカスがなかった、またはフレームがPermissions Policyでブロックされたことが原因です。クリックハンドラー内で直接呼び出し、その前に時間のかかる待機処理を置かないようにしましょう。

Reactでクリップボードにコピーするのにライブラリは必要ですか?

いいえ。writeTextを包む10行ほどのフックで十分です。ライブラリが主に加えるのは、とても古いブラウザー向けのexecCommandによる代替処理で、現在のブラウザーには不要です。

画像をクリップボードにコピーできますか?

はい。navigator.clipboard.writeと、キーがimage/png、値がPNGのBlobであるClipboardItemを使います。事前にClipboardItem.supports()で形式を確認しましょう。ブラウザーが最も確実に受け付ける形式はPNGです。

document.execCommand('copy')はまだ使っても大丈夫ですか?

非推奨です。条件次第で多くのブラウザーではまだ動きますが、新しいコードでは非同期のClipboard APIを使い、失敗時は手動でコピーしてもらう方法に切り替えましょう。

ブラウザーが課す3つのルール

利用者が気づけるフィードバック

リッチなコピーと独自のcopyイベント

プレーンなJavaScript

フィードバックと代替処理付きのコピーボタン

ステータス要素は見た目には隠れていますが、読み上げられます。失敗時はテキストが選択されるので、Ctrl+CまたはCmd+Cを押してもらえます。

Reactフック

useCopyToClipboard

状態とコピー関数を返します。アンマウント時にタイマーを解除するため、削除されたコンポーネントを更新することはありません。

リッチテキスト、画像、copyイベント

プレーンテキストの代替付きでHTMLをコピーする

各MIMEタイプが1つのBlobです。貼り付け先は、理解できる最もリッチな形式を選びます。

通常のコピーに出典の行を加える

使いすぎに注意しましょう。コピー内容を変えると嫌がられることがあるので、出典が役立つ引用やコードに限りましょう。

エラーとその原因

コピーに失敗するとき

コピーしました

失敗しました

コピー

リッチテキストをコピー

クリップボードにコピーしました

コピーに失敗しました。テキストを選択してCtrl+CまたはCmd+Cを押してください。

試してみる

プレーンテキスト用とリッチなHTML用のコピーボタンです。結果を確認する貼り付け用ボックスもあります。

コピーするテキスト

招待:

チームに参加

ここに貼り付けて確認(Ctrl+VまたはCmd+V)

無料で始める · クレジットカード不要

関連: ガイド|Webマーケティングと集客を学ぶ

製品

ご利用いただける方

機能

リソース

会社情報

サイトマップを見る