Using the new Async Clipboard API

Shipping with Chrome 66 is an implementation of the new Async Clipboard API. Its asynchronous nature makes it the preferred way – over document.execCommand – to perform copy-paste operations in the browser.

// Write Text to the Clipboard (e.g. copy)
navigator.clipboard.writeText('Text to be copied')
  .then(() => {
    console.log('Text copied to clipboard');
  .catch(err => {
    // This can happen if the user denies clipboard permissions:
    console.error('Could not copy text: ', err);

// Read Text from Clipboard (e.g. Paste)
  .then(text => {
    console.log('Pasted content: ', text);
  .catch(err => {
    console.error('Failed to read clipboard contents: ', err);

Unblocking Clipboard Access →


<!-- Target -->
<input id="foo" value="">

<!-- Trigger -->
<button class="btn" data-clipboard-target="#foo">
    <img src="assets/clippy.svg" alt="Copy to clipboard">

Copying text to the clipboard shouldn’t be hard. It shouldn’t require dozens of steps to configure or hundreds of KBs to load. But most of all, it shouldn’t depend on Flash or any bloated framework. That’s why clipboard.js exists.

Great to see that this is possible without Flash, but must admit that I’m not too fond of the API and how to use it. For example the name data-clipboard-target is wrong, as it’s the source, not the target. On a sidenote I’m looking forward to the Clipboard API and events spec 😉

Clipboard.js →
Clipboard.js Source (GitHub) →