概要

javascriptClipboard API を使ったクリップボードへの書き込みや読み込みの方法を紹介します。

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

例として、次のようなHTML要素があるとします。

<input id="input" type="text">
<button id="copy">Copy</button>

Copy ボタンを押して input タグの内容をコピーするには writeText 関数を使います。

function copy() {
  const copyText = document.querySelector('#input')
  if (copyText.value) {
   navigator.clipboard.writeText(copyText.value)
  }
}

const button = document.querySelector('#copy')
button.addEventListener('click', copy)

画像をコピーする

こんどは img タグの画像をクリップボードへ書き込んでみます。

次のように、画像とボタンからなるHTMLを用意します。

<img src="./example.jpg">
<button id="copy">Copy</button>

画像を書き込む場合は、画像からバイナリデータを取得し、ClipboardItem を作ります。
後はテキストの書き込みと同じく write を使用します。

async function copy() {
  const img = document.querySelector('img')

  const blob = await fetch(img.src).then(res => res.blob())
  const data = [new window.ClipboardItem({ [blob.type]: blob })]
  navigator.clipboard.write(data)
}

button.addEventListener('click', copy)

クリップボードからの読み込み

クリップボードの内容を表示する textarea と それを実行する Paste ボタンを用意します。

<textarea id="output"></textarea>
<button id="paste">Paste</button>

Paste ボタンを押してクリップボードの内容を textarea に表示するには readText 関数を使います。

async function paste() {
  const text = await navigator.clipboard.readText()

  const pasteTextarea = document.querySelector('#output')
  pasteTextarea.textContent = text
}

button.addEventListener('click', paste)

画像の読み込み

クリップボードの画像を読み込んで img タグに表示してみます。
画像のコピーと同じようなHTMLを用意します。

<img src="./example.jpg">
<button id="paste">Paste</button>

まず、read 関数を使ってクリップボードからファイルを読み込みます。
そして getType でBlobオブジェクトを取得し、そのオブジェクトURLを img タグに書き込みます。

async function paste() {
  const data = await navigator.clipboard.read()
  if (!data.length) {
    return
  }
  const file = data[0]
  for (const type of file.types) {
    if (type.startsWith('image/')) {
      const blob = await file.getType(type)
      const src = URL.createObjectURL(blob)
      const img = document.querySelector('img')
      img.src = src
      return
    }
  }
}

button.addEventListener('click', paste)