在 Chrome 扩展程序中复制到剪贴板

IT技术 javascript clipboard google-chrome-extension
2021-01-31 06:55:30

我正在为 Google Chrome 制作扩展程序,但遇到了障碍。

我需要在弹出窗口中单击时将只读文本区域的内容复制到剪贴板。有没有人知道用纯 Javascript 和没有 Flash 来解决这个问题的最佳方法?我还在扩展中加载了 jQuery,如果有帮助的话。我当前的(非工作)代码是...

function copyHTMLCB() {
$('#lb_html').select();
$('#lb_html').focus();
textRange = document.lb_html_frm.lb_html.createTextRange();
textRange.execCommand("RemoveFormat");
textRange.execCommand("Copy");
alert("HTML has been copied to your clipboard."); }
6个回答

所有功劳都归功于 joelpt,但如果其他人需要它在没有 jQuery 的纯 javascript 中工作(我做到了),这里是他的解决方案的改编版:

function copyTextToClipboard(text) {
  //Create a textbox field where we can insert text to. 
  var copyFrom = document.createElement("textarea");

  //Set the text content to be the text you wished to copy.
  copyFrom.textContent = text;

  //Append the textbox field into the body as a child. 
  //"execCommand()" only works when there exists selected text, and the text is inside 
  //document.body (meaning the text is part of a valid rendered HTML element).
  document.body.appendChild(copyFrom);

  //Select all the text!
  copyFrom.select();

  //Execute command
  document.execCommand('copy');

  //(Optional) De-select the text using blur(). 
  copyFrom.blur();

  //Remove the textbox field from the document.body, so no other JavaScript nor 
  //other elements can get access to this.
  document.body.removeChild(copyFrom);
}
为什么不简单地document.body代替var body = document.getElementsByTagName('body')[0];
2021-03-15 06:55:30
@jscripter 我更新了代码(通过编辑它)。现在等待同行评审。
2021-04-01 06:55:30
它对我有很大帮助!。非常感谢您花时间在平面 js 中再次制作它。
2021-04-10 06:55:30
我想知道为什么它对我不起作用,但后来我发现权限必须设置为“clipboardWrite”或“clipboardRead”,具体取决于我们对剪贴板的处理...
2021-04-11 06:55:30
@Shayan 我保留了原作者的代码,并没有真正考虑改进代码。该代码最初是在 2013 年编写的。
2021-04-11 06:55:30

我发现以下方法效果最好,因为它可以让您指定复制数据的 MIME 类型:

copy: function(str, mimeType) {
  document.oncopy = function(event) {
    event.clipboardData.setData(mimeType, str);
    event.preventDefault();
  };
  document.execCommand("copy", false, null);
}

我正在使用这个简单的函数将任何给定的纯文本复制到剪贴板(仅限 Chrome,使用 jQuery):

// Copy provided text to the clipboard.
function copyTextToClipboard(text) {
    var copyFrom = $('<textarea/>');
    copyFrom.text(text);
    $('body').append(copyFrom);
    copyFrom.select();
    document.execCommand('copy');
    copyFrom.remove();
}

// Usage example
copyTextToClipboard('This text will be copied to the clipboard.');

由于快速的追加-选择-复制-删除序列,似乎没有必要隐藏 textarea 或为其提供任何特定的 CSS/属性。至少在我的机器上,即使有非常大的文本块,Chrome 也不会在删除之前将其渲染到屏幕上。

请注意,这适用于 Chrome 扩展程序/应用程序。如果您使用的是 v2 manifest.json,您应该在那里声明“clipboardWrite”权限;这对于应用程序是必需的,对于扩展程序是推荐的。

获取 '$' 未定义。
2021-04-09 06:55:30

剪贴板API现在由Chrome浏览器的支持,旨在取代document.execCommand

来自 MDN:

navigator.clipboard.writeText(text).then(() => {
    //clipboard successfully set
}, () => {
    //clipboard write failed, use fallback
});
我试过这个,但它只对我失败了。我从后台脚本中尝试过,这只适用于内容脚本吗?我也在清单中设置了 clipboardWrite 权限。
2021-03-21 06:55:30

您可以使用Experimental Clipboard API复制到剪贴板,但它仅在浏览器的 dev 分支中可用,并且默认情况下不启用(更多信息)。

断开的链接,任何新的来源?
2021-03-23 06:55:30
@DimaFomin 这是 Chrome Web Apps 复制/粘贴图像数据,而不是你想要developer.chrome.com/extensions/declare_permissions for Chrome Extensions,而且似乎链接是唯一提到clipboardReadclipboardWrite都提到的地方。
2021-04-01 06:55:30
文档链接已死
2021-04-03 06:55:30
这不再是真的 - 它只需要 clipboardRead 和 -Write 的扩展权限。当前(jQuery)最佳解决方案似乎在这里stackoverflow.com/a/7147192/1129420
2021-04-09 06:55:30
过时的答案,现在可以了,并且线程上提供了更好的解决方案。OP 应该考虑将其取消标记为可接受的答案。
2021-04-12 06:55:30