如何使用JavaScript复制到剪贴板

149 阅读3分钟

有时我使用的网站提供一些我需要复制和粘贴的东西。也许是一个API密钥。也许是我刚买的一个应用程序的激活令牌。

总之,他们让你点击一个盒子,里面的文字就会被复制到剪贴板上,这样我就可以直接去把它粘贴到某个地方。

我们怎样才能在我们的网站上实现这个功能呢?使用剪贴板API!

还有一种方法可以使复制/粘贴工作,使用document.execCommand() 功能。我不打算在这里介绍这个选项。剪贴板API是为了继承该命令的功能。

剪贴板API在navigator.clipboard 对象上可用。

剪贴板API是比较新的,并不是所有的浏览器都实现了它。它在Chrome、现代Edge(基于chromium)、Firefox和Opera上运行。

你可以检查这个对象是否存在,以确保该功能被实现。

if (!navigator.clipboard) {
  // Clipboard API not available
  return
}

现在你必须明白的一件事是,没有用户的许可,你不能从剪贴板上复制/粘贴。

如果你在读或写剪贴板,权限是不同的。如果你是写,你所需要的是用户的意图:你需要把剪贴板的动作放在对用户动作的响应中,比如点击。

写入剪贴板

假设你在一个HTML页面中有一个p 元素。

你在它上面创建了一个点击事件监听器,并首先检查剪贴板API是否可用。

document.querySelector('p').addEventListener('click', async event => {
  if (!navigator.clipboard) {
    // Clipboard API not available
    return
  }
})

现在,我们想把那个p 标签的内容复制到剪贴板上。我们通过查找该元素的innerText ,由event.target 来实现。

document.querySelector('p').addEventListener('click', async event => {
  if (!navigator.clipboard) {
    // Clipboard API not available
    return
  }
  const text = event.target.innerText
})

接下来,我们调用navigator.clipboard.writeText() 方法,用 try/catch 包裹它,以处理可能发生的任何错误。

这就是这个例子的完整代码。

document.querySelector('p').addEventListener('click', async event => {
  if (!navigator.clipboard) {
    // Clipboard API not available
    return
  }
  const text = event.target.innerText
  try {
    await navigator.clipboard.writeText(text)
    event.target.textContent = 'Copied to clipboard'
  } catch (err) {
    console.error('Failed to copy!', err)
  }
})

在这里你可以在Codepen中看到并尝试这个例子

CodePen上看到Flavio Copes (@flaviocopes)的PenA Clipboard API Write例子

从剪贴板中读出

下面是如何从剪贴板中读取的。我们有一个p 元素。

当点击它时,我们想用存储在剪贴板中的内容来改变元素的内容。

首先,我们创建一个点击事件监听器,并检查剪贴板API的可用性。

document.querySelector('p').addEventListener('click', async event => {
  if (!navigator.clipboard) {
    // Clipboard API not available
    return
  }
})

然后我们调用navigator.clipboard.readText() 。使用async/await,我们将文本结果存储到一个text 变量中,并将其作为event.target.textContent 值。

document.querySelector('p').addEventListener('click', async event => {
  if (!navigator.clipboard) {
    // Clipboard API not available
    return
  }
  try {
    const text = await navigator.clipboard.readText()
    event.target.textContent = text
  } catch (err) {
    console.error('Failed to copy!', err)
  }
})

当你在你的网站上第一次执行这段代码时,你会看到这个框出现。

Permission to access the Clipboard API

你需要授予网站从剪贴板读取的权限,否则如果任何网站可以在没有你明确许可的情况下读取你的剪贴板,这将是一个巨大的安全问题。

在Codepen上看到。

请看CodePen上Flavio Copes (@flaviocopes)的PenA Clipboard API Read例子