Clipboard APIサポートの検出と使用方法

テキストと画像の読み書き用のClipboard APIサポートを検出する方法。パーミッション、フォールバック、セキュリティの考慮事項を解説。

Platform

詳細な説明

Clipboard API検出

モダンなClipboard APIは、古いdocument.execCommand('copy')アプローチに代わる、システムクリップボードの読み書き用の非同期インターフェースを提供します。

検出

const hasClipboard = !!navigator.clipboard;
const hasClipboardWrite = !!(
  navigator.clipboard && navigator.clipboard.writeText
);
const hasClipboardRead = !!(
  navigator.clipboard && navigator.clipboard.readText
);

クリップボードへの書き込み

async function copyText(text) {
  if (navigator.clipboard && navigator.clipboard.writeText) {
    await navigator.clipboard.writeText(text);
    return true;
  }
  // フォールバック
  const textarea = document.createElement('textarea');
  textarea.value = text;
  textarea.style.position = 'fixed';
  textarea.style.opacity = '0';
  document.body.appendChild(textarea);
  textarea.select();
  const success = document.execCommand('copy');
  document.body.removeChild(textarea);
  return success;
}

パーミッションとセキュリティ

  • 書き込み: ユーザージェスチャーによってトリガーされた場合、通常パーミッションなしで許可
  • 読み取り: Permissions APIを通じた明示的なユーザー許可が必要
  • HTTPS: 非同期Clipboard APIに必要(HTTPではexecCommandにフォールバック)
  • ユーザージェスチャー: ほとんどのブラウザでクリップボードアクセスに最近のユーザーインタラクション(クリック、キー入力)が必要
  • クロスオリジンiframe: clipboard-writeclipboard-readパーミッションポリシーが必要

リッチコンテンツ

ClipboardItem APIにより画像などのリッチコンテンツの書き込みが可能です:

const blob = new Blob([htmlContent], { type: 'text/html' });
const item = new ClipboardItem({ 'text/html': blob });
await navigator.clipboard.write([item]);

ユースケース

コードエディタ、ドキュメントツール、パスワードマネージャー、およびクリップボードへのコピー機能を持つすべてのアプリケーションに不可欠です。モダンWebアプリはdocument.execCommandをフォールバックとして非同期Clipboard APIを使用すべきです。

試してみる — Browser Feature Detector

フルツールを開く