总览
有三种主要的浏览器API可复制到剪贴板:
- 异步剪贴板API 
[navigator.clipboard.writeText]
 
document.execCommand('copy')
- 截至2015年4月,大多数浏览器都支持此功能(请参阅下面的浏览器支持)。
 
- 访问是同步的,即在页面中停止JavaScript直到完成,包括显示和用户与任何安全提示进行交互。
 
- 从DOM中读取文本并将其放置在剪贴板上。
 
- 在2015年4月〜测试期间,只有Internet Explorer被记录为在写入剪贴板时显示权限提示。
 
 
- 覆盖复制事件
- 请参阅剪贴板API文档中有关覆盖复制事件的信息。
 
- 允许您通过任何复制事件来修改剪贴板上显示的内容,可以包括除纯文本之外的其他数据格式。
 
- 这里没有涉及,因为它不能直接回答问题。
 
 
一般发展说明
在控制台中测试代码时,不要期望剪贴板相关的命令能够正常工作。通常,页面需要处于活动状态(异步剪贴板API)或需要用户交互(例如,用户单击)才能允许(document.execCommand('copy'))访问剪贴板,有关更多详细信息,请参见下文。
重要事项(此处注明2020/02/20)
请注意,由于该帖子最初是在跨源IFRAME和其他IFRAME“沙盒”中弃用的,因此会阻止嵌入式演示“ Run code snippet”按钮和“ codepen.io example”在某些浏览器(包括Chrome和Microsoft Edge)中运行)。
要开发创建自己的网页,请通过HTTPS连接提供该网页以进行测试和开发。
这是一个测试/演示页面,演示了代码的工作原理:https :
 //deanmarktaylor.github.io/clipboard-test/
异步+后备
由于浏览器对新的Async Clipboard API的支持水平,您可能会希望使用该document.execCommand('copy')方法来获得良好的浏览器覆盖率。
这是一个简单的示例(可能无法嵌入该网站,请阅读上面的“重要”说明):
function fallbackCopyTextToClipboard(text) {
  var textArea = document.createElement("textarea");
  textArea.value = text;
  
  // Avoid scrolling to bottom
  textArea.style.top = "0";
  textArea.style.left = "0";
  textArea.style.position = "fixed";
  document.body.appendChild(textArea);
  textArea.focus();
  textArea.select();
  try {
    var successful = document.execCommand('copy');
    var msg = successful ? 'successful' : 'unsuccessful';
    console.log('Fallback: Copying text command was ' + msg);
  } catch (err) {
    console.error('Fallback: Oops, unable to copy', err);
  }
  document.body.removeChild(textArea);
}
function copyTextToClipboard(text) {
  if (!navigator.clipboard) {
    fallbackCopyTextToClipboard(text);
    return;
  }
  navigator.clipboard.writeText(text).then(function() {
    console.log('Async: Copying to clipboard was successful!');
  }, function(err) {
    console.error('Async: Could not copy text: ', err);
  });
}
var copyBobBtn = document.querySelector('.js-copy-bob-btn'),
  copyJaneBtn = document.querySelector('.js-copy-jane-btn');
copyBobBtn.addEventListener('click', function(event) {
  copyTextToClipboard('Bob');
});
copyJaneBtn.addEventListener('click', function(event) {
  copyTextToClipboard('Jane');
});
<div style="display:inline-block; vertical-align:top;">
  <button class="js-copy-bob-btn">Set clipboard to BOB</button><br /><br />
  <button class="js-copy-jane-btn">Set clipboard to JANE</button>
</div>
<div style="display:inline-block;">
  <textarea class="js-test-textarea" cols="35" rows="4">Try pasting into here to see what you have on your clipboard:
  </textarea>
</div>
 
 
(codepen.io示例可能无法正常工作,请阅读上面的“重要”注释)请注意,此代码段在Stack Overflow的嵌入式预览中效果不佳,您可以在此处尝试:https ://codepen.io/DeanMarkTaylor/pen/RMRaJX?editors = 1011
异步剪贴板API
请注意,可以通过Chrome 66中的权限API来“请求权限”并测试对剪贴板的访问权限。
var text = "Example text to appear on clipboard";
navigator.clipboard.writeText(text).then(function() {
  console.log('Async: Copying to clipboard was successful!');
}, function(err) {
  console.error('Async: Could not copy text: ', err);
});
document.execCommand('copy')
本文的其余部分将深入介绍document.execCommand('copy')API 的细微差别和细节。
浏览器支持
对JavaScript的document.execCommand('copy')支持不断增长,请参见下面的链接以获取浏览器更新:
简单的例子
(可能无法嵌入该网站,请阅读上面的“重要”说明)
var copyTextareaBtn = document.querySelector('.js-textareacopybtn');
copyTextareaBtn.addEventListener('click', function(event) {
  var copyTextarea = document.querySelector('.js-copytextarea');
  copyTextarea.focus();
  copyTextarea.select();
  try {
    var successful = document.execCommand('copy');
    var msg = successful ? 'successful' : 'unsuccessful';
    console.log('Copying text command was ' + msg);
  } catch (err) {
    console.log('Oops, unable to copy');
  }
});
<p>
  <button class="js-textareacopybtn" style="vertical-align:top;">Copy Textarea</button>
  <textarea class="js-copytextarea">Hello I'm some text</textarea>
</p>
 
 
复杂的示例:复制到剪贴板而不显示输入
如果有textarea或,以上简单示例效果很好input屏幕上显示元素有用。
在某些情况下,您可能希望将文本复制到剪贴板而不显示input/ textarea元素。这是解决此问题的一种方式(基本上是插入元素,复制到剪贴板,删除元素):
已在Google Chrome 44,Firefox 42.0a1和Internet Explorer 11.0.8600.17814上进行测试。
(可能无法嵌入该网站,请阅读上面的“重要”说明)
function copyTextToClipboard(text) {
  var textArea = document.createElement("textarea");
  //
  // *** This styling is an extra step which is likely not required. ***
  //
  // Why is it here? To ensure:
  // 1. the element is able to have focus and selection.
  // 2. if element was to flash render it has minimal visual impact.
  // 3. less flakyness with selection and copying which **might** occur if
  //    the textarea element is not visible.
  //
  // The likelihood is the element won't even render, not even a
  // flash, so some of these are just precautions. However in
  // Internet Explorer the element is visible whilst the popup
  // box asking the user for permission for the web page to
  // copy to the clipboard.
  //
  // Place in top-left corner of screen regardless of scroll position.
  textArea.style.position = 'fixed';
  textArea.style.top = 0;
  textArea.style.left = 0;
  // Ensure it has a small width and height. Setting to 1px / 1em
  // doesn't work as this gives a negative w/h on some browsers.
  textArea.style.width = '2em';
  textArea.style.height = '2em';
  // We don't need padding, reducing the size if it does flash render.
  textArea.style.padding = 0;
  // Clean up any borders.
  textArea.style.border = 'none';
  textArea.style.outline = 'none';
  textArea.style.boxShadow = 'none';
  // Avoid flash of white box if rendered for any reason.
  textArea.style.background = 'transparent';
  textArea.value = text;
  document.body.appendChild(textArea);
  textArea.focus();
  textArea.select();
  try {
    var successful = document.execCommand('copy');
    var msg = successful ? 'successful' : 'unsuccessful';
    console.log('Copying text command was ' + msg);
  } catch (err) {
    console.log('Oops, unable to copy');
  }
  document.body.removeChild(textArea);
}
var copyBobBtn = document.querySelector('.js-copy-bob-btn'),
  copyJaneBtn = document.querySelector('.js-copy-jane-btn');
copyBobBtn.addEventListener('click', function(event) {
  copyTextToClipboard('Bob');
});
copyJaneBtn.addEventListener('click', function(event) {
  copyTextToClipboard('Jane');
});
<div style="display:inline-block; vertical-align:top;">
  <button class="js-copy-bob-btn">Set clipboard to BOB</button><br /><br />
  <button class="js-copy-jane-btn">Set clipboard to JANE</button>
</div>
<div style="display:inline-block;">
  <textarea class="js-test-textarea" cols="35" rows="4">Try pasting into here to see what you have on your clipboard:
  </textarea>
</div>
 
 
补充笔记
仅在用户采取措施时有效
所有document.execCommand('copy')调用都必须作为用户操作(例如,单击事件处理程序)的直接结果进行。这是一种防止在用户不期望的时候弄乱用户剪贴板的措施。
在此处查看Google Developers帖子更多信息,。
剪贴板API
注意完整的Clipboard API草案规范可以在以下位置找到:https :
 //w3c.github.io/clipboard-apis/
支持吗?
document.queryCommandSupported('copy')true如果命令“浏览器支持”,则应该返回。 
- 并
document.queryCommandEnabled('copy')返回true,document.execCommand('copy')如果立即调用将成功。检查以确保从用户启动的线程调用了该命令,并且满足其他要求。 
但是由于浏览器兼容性问题,谷歌Chrome从日〜4月至〜2015年10月才会返回一个例子true,从document.queryCommandSupported('copy')如果命令是由用户发起的线程调用。
请注意下面的兼容性详细信息。
浏览器兼容性详细信息
虽然通过用户单击而简单地调用document.execCommand('copy')包装在try/ catch块中的调用将使您获得最大的兼容性,但以下使用一些条件:
到任何呼叫document.execCommand,document.queryCommandSupported或document.queryCommandEnabled应该被包裹在一个try/ catch块。
当调用而不是返回时,不同的浏览器实现和浏览器版本会引发不同类型的异常false。
各种浏览器实现仍在不断发展,而Clipboard API仍在起草阶段,因此请记住进行测试。