2010-08-08 116 views
32

我对Google Chrome进行了扩展,并且遇到了麻烦。在Chrome扩展程序中复制到剪贴板

我需要复制一个只读的textarea的内容到剪贴板上点击弹出。有没有人知道最好的方式去纯粹的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."); } 

回答

5

您可以复制使用Experimental Clipboard API到剪贴板,但它只是在浏览器的Dev分支,而不会提供默认(more info)启用..

+7

断开的链接,任何新来源? – 2012-07-10 00:46:51

+4

这不再是真的 - 它只需要clipboardRead和-Write的扩展权限。目前(jQuery)最好的解决方案似乎在这里http://stackoverflow.com/a/7147192/1129420 – iono 2012-08-18 06:37:54

+2

文档链接已死 – Andres 2016-03-13 05:42:21

3

你可以用” t使用execCommand("Copy")复制文本的只读位,它必须是可编辑的文本区域。解决方案是创建一个文本输入元素并从那里复制文本。不幸的是,您不能使用display: nonevisibility: hidden隐藏该元素,因为这也会停止select/copy命令的工作。但是,您可以使用负边距“隐藏”它。以下是我在Chrome扩展程序弹出窗口中获得的简短网址。与SHORTURL(快速和肮脏的方法;-))这是代码的位重新写入弹出窗口:

document.body.innerHTML = '<p><a href="'+shortlink+'" target="_blank" >'+shortlink+'</a><form style="margin-top: -35px; margin-left: -500px;"><input type="text" id="shortlink" value="'+shortlink+'"></form></p>' 
document.getElementById("shortlink").select() 
document.execCommand("Copy") 
16

我使用这个简单的功能,任何给定的明文复制到剪贴板(只有浏览器,用了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'权限;这对于应用程序是强制性的,并推荐用于扩展。

+1

真的很有帮助的答案。这对我很有用。 – Touhid 2014-11-09 11:16:18

34

我发现下面的效果最好,因为它允许您指定的MIME类型为复制的数据:

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

不错,谢谢。 – 2013-04-13 07:51:28

+0

工作过,谢谢! – Meeh 2015-11-24 15:30:12

30

一切归功于joelpt,但如果任何人需要这在纯JavaScript工作,而jQuery的(我做了),这是他的解决方案的改编:

function copyTextToClipboard(text) { 
    var copyFrom = document.createElement("textarea"); 
    copyFrom.textContent = text; 
    var body = document.getElementsByTagName('body')[0]; 
    body.appendChild(copyFrom); 
    copyFrom.select(); 
    document.execCommand('copy'); 
    body.removeChild(copyFrom); 
} 
+0

这个在background.js里面很好用,谢谢! – 2014-07-28 20:10:09

+0

它可以帮助我很多!非常感谢您花时间在平面js上再次创作。 – LogoS 2015-05-11 14:07:31

+2

为什么不简单'document.body'而不是'var body = document.getElementsByTagName('body')[0];'? – jscripter 2015-07-07 22:37:48