How do I copy to the clipboard in JavaScript?
将文本复制到剪贴板的最佳方法是什么?(多浏览器)
我已经尝试过:
1 2 3 4 5 6 7 8 9 | function copyToClipboard(text) { if (window.clipboardData) { // Internet Explorer window.clipboardData.setData("Text", text); } else { unsafeWindow.netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect"); const clipboardHelper = Components.classes["@mozilla.org/widget/clipboardhelper;1"].getService(Components.interfaces.nsIClipboardHelper); clipboardHelper.copyString(text); } } |
但在Internet Explorer中,它给出了一个语法错误。在firefox中,它表示
不使用flash的一个好技巧:trello如何访问用户的剪贴板?
概述
有三个主要的浏览器API用于复制到剪贴板:好的。
- Chrome 66提供文本焦点部分(2018年3月)
- 访问是异步的,使用的是javascript承诺,可以写入,这样安全用户提示(如果显示)就不会中断页面中的javascript。
- 文本可以直接从变量复制到剪贴板。
- 仅在通过HTTPS提供服务的页面上支持。
- 在Chrome中,活动选项卡中的66页可以在没有权限提示的情况下写入剪贴板。
- 截至2015年4月,大多数浏览器都支持此功能(请参阅下面的浏览器支持)。
- 访问是同步的,即停止页面中的javascript直到完成,包括显示和用户与任何安全提示交互。
- 文本从DOM读取并放在剪贴板上。
- 在测试期间~2015年4月,只有Internet Explorer在写入剪贴板时显示权限提示。
- 有关重写复制事件的信息,请参阅剪贴板API文档。
- 允许您从任何复制事件中修改剪贴板上显示的内容,可以包括纯文本以外的其他数据格式。
- 不包括在这里,因为它不能直接回答问题。
一般发展说明
在控制台中测试代码时,不要期望与剪贴板相关的命令可以工作。通常,页面需要处于活动状态(异步剪贴板API)或需要用户交互(例如用户单击)以允许(
由于新的异步剪贴板API的浏览器支持级别不同,您可能希望回退到
下面是一个简单的例子:好的。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 | function fallbackCopyTextToClipboard(text) { var textArea = document.createElement("textarea"); textArea.value = text; 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'); }); |
1 2 3 4 5 6 7 | <button class="js-copy-bob-btn">Set clipboard to BOB</button><br /><br /> <button class="js-copy-jane-btn">Set clipboard to JANE</button> <textarea class="js-test-textarea" cols="35" rows="4">Try pasting into here to see what you have on your clipboard: </textarea> |
好的。
请注意,此代码段在Stack Overflow的Embedded Preview中不起作用,您可以在这里尝试:https://codepen.io/deanmarkTaylor/pen/rmrajx?编辑= 1011好的。异步剪贴板API
- Chrome 66公告贴(2018年3月)
- 引用异步剪贴板API草稿文档
请注意,可以通过chrome 66中的权限API"请求权限"并测试对剪贴板的访问。好的。
1 2 3 4 5 6 | 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('副本')
本文的其余部分将深入讨论
javascript
- Internet Explorer 10+(尽管本文档表明Internet Explorer 5.5+提供了一些支持)。
- Google Chrome 43+(~2015年4月)
- Mozilla Firefox 41+(2015年9月发货)
- Opera 29+(基于Chromium 42,~2015年4月)
简单实例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | 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'); } }); |
< PRE> <代码>
1 2 3 | function copyToClipboard(text) { window.prompt("Copy to clipboard: Ctrl+C, Enter", text); } |
将向用户显示提示框,其中已选择要复制的文本。现在,只需按下ctrl+c和enter(关闭盒子),就足够了——瞧!
现在,剪贴板复制操作是安全的,因为用户可以手动执行(但非常简单)。当然,可以在所有浏览器中使用。
1 2 3 4 5 6 | <button id="demo" onclick="copyToClipboard(document.getElementById('demo').innerHTML)">This is what I want to copy</button> function copyToClipboard(text) { window.prompt("Copy to clipboard: Ctrl+C, Enter", text); } |
以下方法适用于Chrome、Firefox、Internet Explorer和Edge,以及最新版本的Safari(在2016年10月发布的版本10中添加了副本支持)。
- 创建一个文本区域,并将其内容设置为要复制到剪贴板的文本。
- 将文本区域附加到DOM。
- 在文本区域中选择文本。
- 调用document.execcommand("copy")。
- 从DOM中移除文本区域。
注意:您将看不到文本区域,因为它是在相同的JavaScript代码同步调用中添加和删除的。
如果您自己执行此操作,则需要注意一些事项:
- 出于安全原因,这只能从事件处理程序(如单击)调用(与打开窗口相同)。
- 第一次更新剪贴板时,IE将显示一个权限对话框。
- 也就是说,当文本区域聚焦时,边缘将滚动。
- execCommand()在某些情况下可能引发。
- 除非使用文本区域,否则换行符和制表符可能会被忽略。(大多数文章似乎建议使用DIV)
- 当显示IE对话框时,文本区域将可见,您要么需要隐藏它,要么使用IE特定的ClipboardData API。
- 在IE系统中,管理员可以禁用剪贴板API。
下面的函数应该尽可能干净地处理以下所有问题。如果您发现任何问题或有任何改进建议,请留言。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | // Copies a string to the clipboard. Must be called from within an // event handler such as click. May return false if it failed, but // this is not always possible. Browser support for Chrome 43+, // Firefox 42+, Safari 10+, Edge and IE 10+. // IE: The clipboard feature may be disabled by an administrator. By // default a prompt is shown the first time the clipboard is // used (per session). function copyToClipboard(text) { if (window.clipboardData && window.clipboardData.setData) { // IE specific code path to prevent textarea being shown while dialog is visible. return clipboardData.setData("Text", text); } else if (document.queryCommandSupported && document.queryCommandSupported("copy")) { var textarea = document.createElement("textarea"); textarea.textContent = text; textarea.style.position ="fixed"; // Prevent scrolling to bottom of page in MS Edge. document.body.appendChild(textarea); textarea.select(); try { return document.execCommand("copy"); // Security exception may be thrown by some browsers. } catch (ex) { console.warn("Copy to clipboard failed.", ex); return false; } finally { document.body.removeChild(textarea); } } } |
https://jsfiddle.net/fx6a6n6x/
如果您想要一个真正简单的解决方案(集成时间不到5分钟),并且看起来很好,那么clippy是一些更复杂的解决方案的一个不错的替代方案。
它是由Github的联合创始人撰写的。下面的Flash嵌入代码示例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | <object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="110" height="14" id="clippy"> <param name="movie" value="/flash/clippy.swf"/> <param name="allowScriptAccess" value="always"/> <param name="quality" value="high"/> <param name="scale" value="noscale"/> <param NAME="FlashVars" value="text=#{text}"/> <param name="bgcolor" value="#{bgcolor}"/> <embed src="/flash/clippy.swf" width="110" height="14" name="clippy" quality="high" allowScriptAccess="always" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" FlashVars="text=#{text}" bgcolor="#{bgcolor}"/> </object> |
记住用需要复制的文本替换
从网页读取和修改剪贴板会引起安全和隐私问题。但是,在Internet Explorer中,可以这样做。我发现这个示例片段:
1 2 3 4 5 6 7 8 9 10 11 12 | <script type="text/javascript"> function select_all(obj) { var text_val=eval(obj); text_val.focus(); text_val.select(); r = text_val.createTextRange(); if (!r.execCommand) return; // feature detection r.execCommand('copy'); } <input value="http://www.sajithmr.com" onclick="select_all(this)" name="url" type="text" /> |
我最近写的博客技术后,在这一问题(工作)在lucidchart和我们最近做的一个overhaul对我们的clipboard)。 P / < >
copying平原,到clipboard也relatively简单,assuming你想做在它的拷贝的系统事件(用户ctrlc出版社或用途的browser的菜单)。 P / < >
1 2 3 4 5 6 7 8 9 10 11 12 | var isIe = (navigator.userAgent.toLowerCase().indexOf("msie") != -1 || navigator.userAgent.toLowerCase().indexOf("trident") != -1); document.addEventListener('copy', function(e) { var textToPutOnClipboard ="This is some text"; if (isIe) { window.clipboardData.setData('Text', textToPutOnClipboard); } else { e.clipboardData.setData('text/plain', textToPutOnClipboard); } e.preventDefault(); }); |
把文本上的clipboard不在系统的拷贝的事件也多了更多的困难的。它看起来像一些其他回答这些参考的方式做它通过闪光,这是唯一的browser交叉的方式来做它的(太远了,我明白了)。 P / < >
除此之外,有一些options C browser - by - browser的基础上。 P / < >
这就是现在在简单的IE,在那里你可以访问的对象clipboarddata美元anytime从javascript通过: P / < >
1 | window.clipboardData |
(当你attempt做这个系统的外切,拷贝,或贴的事件,然而,IE会提示"用户到格兰特的Web应用clipboard权限。) P / < >
在chrome,你可以创建一个chrome扩展,会给你clipboard permissions(这也就是我们做为lucidchart)。然后为用户和你的"installed你将只需要火事件:自己的邮件系统 P / < >
1 | document.execCommand('copy'); |
它看起来像Firefox的一些options腹部,让用户到格兰特permissions到某些网站的访问到的clipboard,但我没有任何总personally"了。 P / < >
js是一个小型的非闪存实用程序,允许将文本或HTML数据复制到剪贴板。它非常容易使用,只需包含.js并使用如下内容:
1 2 3 4 5 6 7 8 9 10 11 12 13 | <button id='markup-copy'>Copy Button</button> document.getElementById('markup-copy').addEventListener('click', function() { clipboard.copy({ 'text/plain': 'Markup text. Paste me into a rich text editor.', 'text/html': 'here is some rich text' }).then( function(){console.log('success'); }, function(err){console.log('failure', err); }); }); |
clipboard.js也在Github上。
Note: This has been deprecated now. Migrate to here.
这是我对那个的看法……
1 2 3 4 5 6 7 8 9 | function copy(text) { var input = document.createElement('input'); input.setAttribute('value', text); document.body.appendChild(input); input.select(); var result = document.execCommand('copy'); document.body.removeChild(input) return result; } |
zeroclipboard也最好的交叉browser溶液)发现: P / < >
1 2 3 4 | Click to copy <script src="ZeroClipboard.js"> var clip = new ZeroClipboard( document.getElementById('copy') ); |
如果你需要非Flash的支持为凹陷,你只是给落回: P / < >
1 2 3 4 5 6 | clip.on( 'noflash', function ( client, args ) { $("#copy").click(function(){ var txt = $(this).attr('data-clipboard-text'); prompt ("Copy link, then click OK.", txt); }); }); |
网址:/ / / zeroclipboard.org P / < >
github.com https:/ / / / / zeroclipboard zeroclipboard P / < >
从我正在处理的项目中,有一个jQuery复制到剪贴板插件,它使用了零剪贴板库。
如果你是一个很重的jquery用户,那么它比本机零剪贴板插件更容易使用。
天哪,还不知道为什么还没有人指出这一点。
各位,在2018年,你们可以这样做:
1 2 3 4 5 6 7 8 9 | async copySomething(text?) { try { const toCopy = text || location.href; await navigator.clipboard.writeText(toCopy); console.log('Text or Page URL copied'); } catch (err) { console.error('Failed to copy: ', err); } } |
在我的Angular6+代码中使用,就像这样:
1 2 3 | <button mat-menu-item (click)="copySomething()"> <span>Copy link</span> </button> |
如果我传入一个字符串,它就会复制它。如果没有,则复制页面的URL。
更多的体操到剪贴板的东西也可以做。请在此处查看更多信息:
https://developers.google.com/web/updates/2018/03/clipboardapi
我发现了以下的解决办法: P / < >
在关键的自上而下的处理程序creates"预"的成员。我们设定的内容拷贝到给该成员,然后做出selection成员在这真的在和返回的句柄。这calls标准处理程序的chrome和copies选择的文本。 P / < >
如果你需要,你可以设定为"timeout功能为restoring previous selection。我的mootools实施C: P / < >
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 | function EnybyClipboard() { this.saveSelection = false; this.callback = false; this.pastedText = false; this.restoreSelection = function() { if (this.saveSelection) { window.getSelection().removeAllRanges(); for (var i = 0; i < this.saveSelection.length; i++) { window.getSelection().addRange(this.saveSelection[i]); } this.saveSelection = false; } }; this.copyText = function(text) { var div = $('special_copy'); if (!div) { div = new Element('pre', { 'id': 'special_copy', 'style': 'opacity: 0;position: absolute;top: -10000px;right: 0;' }); div.injectInside(document.body); } div.set('text', text); if (document.createRange) { var rng = document.createRange(); rng.selectNodeContents(div); this.saveSelection = []; var selection = window.getSelection(); for (var i = 0; i < selection.rangeCount; i++) { this.saveSelection[i] = selection.getRangeAt(i); } window.getSelection().removeAllRanges(); window.getSelection().addRange(rng); setTimeout(this.restoreSelection.bind(this), 100); } else return alert('Copy not work. :('); }; this.getPastedText = function() { if (!this.pastedText) alert('Nothing to paste. :('); return this.pastedText; }; this.pasteText = function(callback) { var div = $('special_paste'); if (!div) { div = new Element('textarea', { 'id': 'special_paste', 'style': 'opacity: 0;position: absolute;top: -10000px;right: 0;' }); div.injectInside(document.body); div.addEvent('keyup', function() { if (this.callback) { this.pastedText = $('special_paste').get('value'); this.callback.call(null, this.pastedText); this.callback = false; this.pastedText = false; setTimeout(this.restoreSelection.bind(this), 100); } }.bind(this)); } div.set('value', ''); if (document.createRange) { var rng = document.createRange(); rng.selectNodeContents(div); this.saveSelection = []; var selection = window.getSelection(); for (var i = 0; i < selection.rangeCount; i++) { this.saveSelection[i] = selection.getRangeAt(i); } window.getSelection().removeAllRanges(); window.getSelection().addRange(rng); div.focus(); this.callback = callback; } else return alert('Fail to paste. :('); }; } |
usage: P / < >
1 2 3 4 5 6 7 | enyby_clip = new EnybyClipboard(); //init enyby_clip.copyText('some_text'); // place this in CTRL+C handler and return true; enyby_clip.pasteText(function callback(pasted_text) { alert(pasted_text); }); // place this in CTRL+V handler and return true; |
贴上它creates textarea和工程相同的方式。 P / < >
这可能是PS溶液可以用为creating全交叉browser溶液没有闪光。其作品在FF和chrome。 P / < >
从最近开始,
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 | function selectElementContents(el) { // Copy textarea, pre, div, etc. if (document.body.createTextRange) { // IE var textRange = document.body.createTextRange(); textRange.moveToElementText(el); textRange.select(); textRange.execCommand("Copy"); } else if (window.getSelection && document.createRange) { // non-IE var range = document.createRange(); range.selectNodeContents(el); var sel = window.getSelection(); sel.removeAllRanges(); sel.addRange(range); try { var successful = document.execCommand('copy'); var msg = successful ? 'successful' : 'unsuccessful'; console.log('Copy command was ' + msg); } catch (err) { console.log('Oops, unable to copy'); } } } // end function selectElementContents(el) function make_copy_button(el) { var copy_btn = document.createElement('input'); copy_btn.type ="button"; el.parentNode.insertBefore(copy_btn, el.nextSibling); copy_btn.onclick = function() { selectElementContents(el); }; if (document.queryCommandSupported("copy") || parseInt(navigator.userAgent.match(/Chrom(e|ium)\/([0-9]+)\./)[2]) >= 42) { // Copy works with IE 4+, Chrome 42+, Firefox 41+, Opera 29+ copy_btn.value ="Copy to Clipboard"; } else { // Select only for Safari and older Chrome, Firefox and Opera copy_btn.value ="Select All (then press CTRL+C to Copy)"; } } /* Note: document.queryCommandSupported("copy") should return"true" on browsers that support copy but there was a bug in Chrome versions 42 to 47 that makes it return"false". So in those versions of Chrome feature detection does not work! See https://code.google.com/p/chromium/issues/detail?id=476508 */ make_copy_button(document.getElementById("markup")); |
1 2 | [cc lang="javascript"] Text that can be copied or selected with cross browser support. |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | </P><div class="suo-content">[collapse title=""]<ul><li>谢谢你总结!代码中有一些错误:您定义了两次"range"变量(var range=document.createrage())。</li><li>你说得对@Christianengel。我把第二个拆了。我不知道它是怎么进来的。</li></ul>[/collapse]</div><hr><P>其他方法将把纯文本复制到剪贴板。要复制HTML(即,可以将结果粘贴到wsiwyg编辑器中),只能在IE中执行以下操作。这与其他方法有本质的不同,因为浏览器实际上可以明显地选择内容。</P>[cc lang="javascript"]// create an editable DIV and append the HTML content you want copied var editableDiv = document.createElement("div"); with (editableDiv) { contentEditable = true; } editableDiv.appendChild(someContentElement); // select the editable content and copy it to the clipboard var r = document.body.createTextRange(); r.moveToElementText(editableDiv); r.select(); r.execCommand("Copy"); // deselect, so the browser doesn't leave the element visibly selected r.moveToElementText(someHiddenDiv); r.select(); |
我使用这个非常成功(没有jquery或任何其他框架)。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | function copyToClp(txt){ txt = document.createTextNode(txt); var m = document; var w = window; var b = m.body; b.appendChild(txt); if (b.createTextRange) { var d = b.createTextRange(); d.moveToElementText(txt); d.select(); m.execCommand('copy'); } else { var d = m.createRange(); var g = w.getSelection; d.selectNodeContents(txt); g().removeAllRanges(); g().addRange(d); m.execCommand('copy'); g().removeAllRanges(); } txt.remove(); } |
警告
选项卡被转换为空格(至少在chrome中)。
我把我认为最好的东西放在一起。
- 使用csstext避免IE中的异常,而不是直接使用样式。
- 如果有选择,则还原选择
- 将只读设置为不在移动设备上显示键盘
- 有一个针对iOS的解决方案,因此它实际工作时通常会阻塞execcommand。
这里是:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 | const copyToClipboard = (function initClipboardText() { const textarea = document.createElement('textarea'); // Move it off screen. textarea.style.cssText = 'position: absolute; left: -99999em'; // Set to readonly to prevent mobile devices opening a keyboard when // text is .select()'ed. textarea.setAttribute('readonly', true); document.body.appendChild(textarea); return function setClipboardText(text) { textarea.value = text; // Check if there is any content selected previously. const selected = document.getSelection().rangeCount > 0 ? document.getSelection().getRangeAt(0) : false; // iOS Safari blocks programmtic execCommand copying normally, without this hack. // https://stackoverflow.com/questions/34045777/copy-to-clipboard-using-javascript-in-ios if (navigator.userAgent.match(/ipad|ipod|iphone/i)) { const editable = textarea.contentEditable; textarea.contentEditable = true; const range = document.createRange(); range.selectNodeContents(textarea); const sel = window.getSelection(); sel.removeAllRanges(); sel.addRange(range); textarea.setSelectionRange(0, 999999); textarea.contentEditable = editable; } else { textarea.select(); } try { const result = document.execCommand('copy'); // Restore previous selection. if (selected) { document.getSelection().removeAllRanges(); document.getSelection().addRange(selected); } return result; } catch (err) { return false; } }; })(); |
用法:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 | <!DOCTYPE html> <style> #t { width: 1px height: 1px border: none } #t:focus { outline: none } </style> function copy(text) { var t = document.getElementById('t') t.innerHTML = text t.select() try { var successful = document.execCommand('copy') var msg = successful ? 'successfully' : 'unsuccessfully' console.log('text coppied ' + msg) } catch (err) { console.log('Unable to copy text') } t.innerHTML = '' } <textarea id=t></textarea> <button onclick="copy('hello world')"> Click me </button> |
从Flash10开始,只有当操作源自用户与Flash对象的交互时,才能复制到剪贴板。(阅读Adobe Flash10发布的相关部分)
解决方案是在"复制"按钮上方过度闪烁对象,或者启动复制的任何元素。零剪贴板当前是此实现的最佳库。经验丰富的flash开发者可能只想制作自己的库。
我找到了以下解决方案:
我将文本隐藏在一个输入中。因为
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | jQuery('#copy').on('click', function () { copyToClipboard(); }); function copyToClipboard() { var target = jQuery('#hidden_text'); // make it visible, so can be focused target.attr('type', 'text'); target.focus(); // select all the text target[0].setSelectionRange(0, target.val().length); // copy the selection var succeed; try { succeed = document.execCommand("copy"); } catch (e) { succeed = false; } // hide input again target.attr('type', 'hidden'); return succeed; } |
将文本从HTML输入复制到剪贴板
1
2
3
4
5
6
7
8
9
10
11
12
13 function myFunction() {
/* Get the text field */
var copyText = document.getElementById("myInput");
/* Select the text field */
copyText.select();
/* Copy the text inside the text field */
document.execCommand("Copy");
/* Alert the copied text */
alert("Copied the text:" + copyText.value);
}
1
2
3
4
5 <!-- The text field -->
<input type="text" value="Hello Friend" id="myInput">
<!-- The button used to copy the text -->
<button onclick="myFunction()">Copy text</button>Note: The
document.execCommand() method is not supported in IE9 and earlier.
来源:W3Schools-将文本复制到剪贴板
在IE以外的浏览器中,您需要使用一个小的flash对象来操作剪贴板,例如
- 自动复制到剪贴板
我也遇到了同样的问题:从Excel(类似于Excel)构建自定义网格编辑以及与Excel的兼容性。我必须支持选择多个单元格、复制和粘贴。
解决方案:创建一个文本区域,在其中插入要复制的用户的数据(对于我,当用户选择单元格时),将焦点设置为该文本(例如,当用户按ctrl时),然后选择整个文本。
所以,当用户点击ctrl+c时,他/她会得到他/她选择的复制单元。测试后,只需将文本区域调整为一个像素(我没有测试它是否会在显示器上工作:无)。它在所有浏览器上都能很好地工作,并且对用户是透明的。
粘贴-你也可以这样做(不同于你的目标)-保持对文本区域的关注,并使用onPaste捕获粘贴事件(在我的项目中,我使用单元格中的文本区域进行编辑)。
我不能粘贴一个例子(商业项目),但你知道这个想法。
已经有很多答案了,但我喜欢添加一个(jquery)。在任何浏览器上都像是一种魅力,在移动浏览器上也一样(即提示安全性,但当您接受它时,它就可以正常工作)。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | function appCopyToClipBoard( sText ) { var oText = false, bResult = false; try { oText = document.createElement("textarea"); $(oText).addClass('clipboardCopier').val(sText).insertAfter('body').focus(); oText.select(); document.execCommand("Copy"); bResult = true; } catch(e) {} $(oText).remove(); return bResult; } |
在您的代码中:
1 2 | if( !appCopyToClipBoard( 'Hai there! This is copied to the clipboard.' )) { alert('Sorry, copy to clipboard failed.'); } |
我用过clipboard.js
我们可以在NPM上找到它
1 | npm install clipboard --save |
也在鲍尔
1 | bower install clipboard --save |
用法示例位于https://zenorocha.github.io/clipboard.js/
这是@chase答案的扩展,其优点是它可以用于图像和表格元素,而不仅仅是IE9上的div。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | if (document.createRange) { // IE9 and modern browsers var r = document.createRange(); r.setStartBefore(to_copy); r.setEndAfter(to_copy); r.selectNode(to_copy); var sel = window.getSelection(); sel.addRange(r); document.execCommand('Copy'); // does nothing on FF } else { // IE 8 and earlier. This stuff won't work on IE9. // (unless forced into a backward compatibility mode, // or selecting plain divs, not img or table). var r = document.body.createTextRange(); r.moveToElementText(to_copy); r.select() r.execCommand('Copy'); } |
看来misread)的问题,但对于参考,你可以提取的范围内的DOM(不是clipboard;compatible与所有现代browsers),和它combine与oncopy和onpaste和onbeforepaste事件得到clipboard行为。这里的代码实现这个: P / < >
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 | function clipBoard(sCommand) { var oRange=contentDocument.createRange(); oRange.setStart(startNode, startOffset); oRange.setEnd(endNode, endOffset); /* This is where the actual selection happens. in the above, startNode and endNode are dom nodes defining the beginning and end of the"selection" respectively. startOffset and endOffset are constants that are defined as follows: END_TO_END: 2 END_TO_START: 3 NODE_AFTER: 1 NODE_BEFORE: 0 NODE_BEFORE_AND_AFTER: 2 NODE_INSIDE: 3 START_TO_END: 1 START_TO_START: 0 and would be used like oRange.START_TO_END */ switch(sCommand) { case"cut": this.oFragment=oRange.extractContents(); oRange.collapse(); break; case"copy": this.oFragment=oRange.cloneContents(); break; case"paste": oRange.deleteContents(); var cloneFragment=this.oFragment.cloneNode(true) oRange.insertNode(cloneFragment); oRange.collapse(); break; } } |
我的坏的。这只在IE。 P / < >
这里的另一种方式争取到拷贝的文本: P / < >
1 2 3 4 5 | <p> Copy </p> |
这是其他答案之间的一个组合。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | var copyToClipboard = function(textToCopy){ $("body") .append($('<input type="text" name="fname" class="textToCopyInput"/>' ) .val(textToCopy)) .find(".textToCopyInput") .select(); try { var successful = document.execCommand('copy'); var msg = successful ? 'successful' : 'unsuccessful'; alert('Text copied to clipboard!'); } catch (err) { window.prompt("To copy the text to clipboard: Ctrl+C, Enter", textToCopy); } $(".textToCopyInput").remove(); } |
它使用jquery,但当然不必。如果你愿意,你可以改变它。我刚把jquery交给我处理。您还可以添加一些CSS以确保输入不显示。例如:
1 | .textToCopyInput{opacity: 0; position: absolute;} |
当然,你也可以做一些内嵌的样式。
1 | .append($('<input type="text" name="fname" style="opacity: 0; position: absolute;" class="textToCopyInput"/>' ) |
要将所选文本("要复制的文本")复制到剪贴板上,请创建一个bookmarklet(执行javascript的浏览器书签)并执行它(单击它)。它将创建一个临时文本区域。
来自Github的代码:
https://gist.github.com/stefanmaric/2abf96c740191cda3bc7a8b0fc905a7d
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | (function (text) { var node = document.createElement('textarea'); var selection = document.getSelection(); node.textContent = text; document.body.appendChild(node); selection.removeAllRanges(); node.select(); document.execCommand('copy'); selection.removeAllRanges(); document.body.removeChild(node); })('Text To Copy'); |
这是我在网上寻找各种各样的方法之后唯一能做的事情。这是一个混乱的话题。世界各地发布了很多解决方案,其中大多数都不起作用。这对我很有用:
注意:此代码仅在作为"onclick"方法之类的直接同步代码执行时才起作用。如果您以异步方式调用对Ajax的异步响应或任何其他异步方式,它将不起作用。
1 2 3 4 5 6 7 8 9 10 11 | copyToClipboard(text) { var copyText = document.createElement("input"); copyText.type ="text"; document.body.appendChild(copyText); copyText.style ="display: inline; width: 1px;"; copyText.value = text; copyText.focus(); document.execCommand("SelectAll"); document.execCommand("Copy"); copyText.remove(); } |
我确实意识到这段代码会在一毫秒内在屏幕上显示一个1px宽的组件,但我决定不担心这个问题,如果是真正的问题,其他人可以解决这个问题。
我必须从页面中复制非输入框文本(任何DIV/SPAN标记中的文本),并得出以下代码。唯一的诀窍是有一个隐藏的字段,但作为类型文本,不适用于隐藏的类型。
1 2 3 4 5 6 7 8 9 10 11 12 | function copyToClipboard(sID) { var aField = document.getElementById("hiddenField"); aField.hidden = false; aField.value = document.getElementById(sID).textContent; aField.select(); document.execCommand("copy"); alert("Following text has been copied to the clipboard. " + aField.value); aField.hidden = true; } |
在HTML中添加以下内容
input type="text"id="hiddenfield"style="width:5px;border:0"/>…
似乎您从greasemonkeyjavascript copy to clipboard按钮或此代码段的原始源获取了代码…
这个代码是针对Greasemonkey的,因此是不安全窗口。我猜IE中的语法错误来自于特定于Firefox的
据我所知,它只在Internet Explorer中工作。
另请参见动态工具-javascript复制到剪贴板,但它要求用户先更改配置,即使这样也不起作用。
我本来打算使用clipboard.js,但它还没有任何移动解决方案…所以我写了一个超小的图书馆:
网址:https://github.com/ryanpcmcquen/cheval
这将复制文本(desktop/android/safari 10+),或者至少选择文本(旧版本的iOS)。缩小到1千字节以上。在桌面Safari中(按Command+C进行复制。您也不需要编写任何JavaScript来使用它。
为安全原因,你不能做那个。你必须选择Flash为copying clipboard。 P / < >
我建议这一个:/ / / zeroclipboard.org P / < >
更新2015:目前有一种方法可以使用
在chrome你可以使用
@吉米,睾丸的简单的AJAX /会话的基础clipboard为相同的网站。 P / < >
注意,伴奏者必须enabled AMP &;*,这有效的工程解决方案为相同的网站。它在我的身体codeigniter,但我跑到会话/ Ajax的问题,但这solved问题,太。如果你不想玩与会议,使用的数据库表。 P / < >
javascript / jquery P / < >
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | <script type="text/javascript"> $(document).ready(function() { $("#copy_btn_id").click(function(){ $.post("<?php echo base_url();?>ajax/foo_copy/"+$(this).val(), null, function(data){ // Copied successfully },"html" ); }); $("#paste_btn_id").click(function() { $.post("<?php echo base_url();?>ajax/foo_paste/", null, function(data) { $('#paste_btn_id').val(data); },"html" ); }); }); |
HTML的内容 P / < >
1 2 | <input type='text' id='copy_btn_id' onclick='this.select();' value='myvalue' /> <input type='text' id='paste_btn_id' value='' /> |
php代码 P / < >
1 2 3 4 5 6 7 8 9 10 11 12 13 | <?php class Ajax extends CI_Controller { public function foo_copy($val){ $this->session->set_userdata(array('clipboard_val' => $val)); } public function foo_paste(){ echo $this->session->userdata('clipboard_val'); exit(); } } ?> |
如果copied腹部链接到pasted在相同的网站,然后简单的解决方案是highlight的正文之前,pressing的简单HTML拷贝的按钮,然后在它pressing,正文内容的stored在伴奏者。和无论它去pasted,有贴的按钮。 P / < >
*我知道,这不是在持久性和通用的解决方案,但它的东西:) P / < >
使用使用
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | copyToClipboard() { let el = document.getElementById('Test').innerText el.focus(); // el.select(); try { var successful = document.execCommand('copy'); if (successful) { console.log('Copied Successfully! Do whatever you want next'); } else { throw ('Unable to copy'); } } catch (err) { console.warn('Oops, Something went wrong ', err); } } |
在的情况下,你在阅读正文从clipboard在chrome扩展,clipboardread"和"allowed权限,你可以使用下面的代码: P / < >
1 2 3 4 5 6 7 8 9 10 | function readTextFromClipboardInChromeExtension() { var ta = $('<textarea/>'); $('body').append(ta); ta.focus(); document.execCommand('paste'); var text = ta.val(); ta.blur(); ta.remove(); return text; } |
除了DeanTaylor的最新答案(2015年7月)外,我还编写了一个类似于他的示例的jQuery方法。
杰西德
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 | /** * Copies the current selected text to the SO clipboard * This method must be called from an event to work with `execCommand()` * @param {String} text Text to copy * @param {Boolean} [fallback] Set to true shows a prompt * @return Boolean Returns `true` if the text was copied or the user clicked on accept (in prompt), `false` otherwise */ var CopyToClipboard = function(text, fallback){ var fb = function () { $t.remove(); if (fallback !== undefined && fallback) { var fs = 'Please, copy the following text:'; if (window.prompt(fs, text) !== null) return true; } return false; }; var $t = $('<textarea />'); $t.val(text).css({ width: '100px', height: '40px' }).appendTo('body'); $t.select(); try { if (document.execCommand('copy')) { $t.remove(); return true; } fb(); } catch (e) { fb(); } }; |
在搜索支持Safari和其他浏览器(IE9+)的解决方案后,
我使用与github相同的:zeroclipboard
例子:http://zeroclipboard.org/index-v1.x.html
HTML
1 2 3 4 5 6 7 | <html> <body> <button id="copy-button" data-clipboard-text="Copy Me!" title="Click to copy me.">Copy to Clipboard</button> <script src="ZeroClipboard.js"> <script src="main.js"> </body> </html> |
JS
1 2 3 4 5 6 7 8 9 10 11 12 | var client = new ZeroClipboard(document.getElementById("copy-button")); client.on("ready", function (readyEvent) { // alert("ZeroClipboard SWF is ready!" ); client.on("aftercopy", function (event) { // `this` === `client` // `event.target` === the element that was clicked event.target.style.display ="none"; alert("Copied text to clipboard:" + event.data["text/plain"]); }); }); |
这是唯一对我有用的东西:
1 2 3 4 5 6 | let textarea = document.createElement('textarea'); textarea.setAttribute('type', 'hidden'); textarea.textContent = 'the string you want to copy'; document.body.appendChild(textarea); textarea.select(); document.execCommand('copy'); |
只是在答案中加上我的。
这是最好的。如此多的胜利。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | var toClipboard = function(text) { var doc = document; // Create temp element var textarea = doc.createElement('textarea'); textarea.style.position = 'absolute'; textarea.style.opacity = '0'; textarea.textContent = text; doc.body.appendChild(textarea); textarea.focus(); textarea.setSelectionRange(0, textarea.value.length); // copy the selection var success; try { success = doc.execCommand("copy"); } catch(e) { success = false; } textarea.remove(); return success; } |
我在一个简单的解决方案中编译了几个函数来覆盖所有的情况,如果需要的话,可以使用提示回退。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | window.copyToClipboard = function(text) { // IE specific if (window.clipboardData && window.clipboardData.setData) { return clipboardData.setData("Text", text); } // all other modern target = document.createElement("textarea"); target.style.position ="absolute"; target.style.left ="-9999px"; target.style.top ="0"; target.textContent = text; document.body.appendChild(target); target.focus(); target.setSelectionRange(0, target.value.length); // copy the selection of fall back to prompt try { document.execCommand("copy"); target.remove(); console.log('Copied to clipboard:"'+text+'"'); } catch(e) { console.log("Can't copy string on this browser. Try to use Chrome, Firefox or Opera.") window.prompt("Copy to clipboard: Ctrl+C, Enter", text); } } |
在这里测试它https://jsfiddle.net/jv0avz65/
使用EDOCX1[0]将为您完成这项工作…
用它你也可以做剪切,复制和粘贴…
这是一个简单的剪贴板复制功能,可以复制输入文本中的所有内容…
1 2 3 4 5 6 7 | function copyInputText() { var copyText = document.querySelector("#input"); copyText.select(); document.execCommand("copy"); } document.querySelector("#copy").addEventListener("click", copyInputText); |
1 2 | <input id="input" type="text" /> <button id="copy">Copy</button> |
有关详细信息,请访问此处
这里有一个关于角5.x+的优雅的解决方案:
组件:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 | import { ChangeDetectionStrategy, ChangeDetectorRef, Component, ElementRef, EventEmitter, Input, OnInit, Output, Renderer2, ViewChild } from '@angular/core'; @Component({ selector: 'copy-to-clipboard', templateUrl: './copy-to-clipboard.component.html', styleUrls: ['./copy-to-clipboard.component.scss'], changeDetection: ChangeDetectionStrategy.OnPush }) export class CopyToClipboardComponent implements OnInit { @ViewChild('input') input: ElementRef; @Input() size = 'md'; @Input() theme = 'complement'; @Input() content: string; @Output() copied: EventEmitter<string> = new EventEmitter<string>(); @Output() error: EventEmitter<string> = new EventEmitter<string>(); constructor(private renderer: Renderer2) {} ngOnInit() {} copyToClipboard() { const rootElement = this.renderer.selectRootElement(this.input.nativeElement); // iOS Safari blocks programmtic execCommand copying normally, without this hack. // https://stackoverflow.com/questions/34045777/copy-to-clipboard-using-javascript-in-ios if (navigator.userAgent.match(/ipad|ipod|iphone/i)) { this.renderer.setAttribute(this.input.nativeElement, 'contentEditable', 'true'); const range = document.createRange(); range.selectNodeContents(this.input.nativeElement); const sel = window.getSelection(); sel.removeAllRanges(); sel.addRange(range); rootElement.setSelectionRange(0, 999999); } else { rootElement.select(); } try { document.execCommand('copy'); this.copied.emit(); } catch (err) { this.error.emit(err); } }; } |
模板:
1 2 3 4 5 | <button class="btn btn-{{size}} btn-{{theme}}" type="button" (click)="copyToClipboard()"> <ng-content></ng-content> </button> <input #input class="hidden-input" [ngModel]="content"> |
Styles:
1 2 3 4 5 6 7 8 9 10 11 12 | .hidden-input { position: fixed; top: 0; left: 0; width: 1px; height: 1px; padding: 0; border: 0; box-shadow: none; outline: none; background: transparent; } |
这是我的解决方案
1 2 3 4 5 6 7 8 9 10 | var codeElement = document.getElementsByClassName("testelm") && document.getElementsByClassName("testelm").length ? document.getElementsByClassName("testelm")[0] :""; if (codeElement !="") { var e = document.createRange(); e.selectNodeContents(codeElement); var selection = window.getSelection(); selection.removeAllRanges(); selection.addRange(e); document.execCommand("Copy"); selection.removeAllRanges(); } |
这可以通过使用getElementByID、select()、blur()和copy命令的组合来完成。
注释
select()方法选择一个元素或具有文本字段的元素中的所有文本。这个按钮可能不起作用
用法
1 2 3 4 5 | let copyText = document.getElementById('input-field'); copyText.select() document.execCommand("copy"); copyReferal.blur() document.getElementbyId('help-text').textContent = 'Copied' |
blur()方法将删除难看的突出显示部分,而不是在漂亮的消息中显示内容已成功复制。
我已经将@dean taylor在这里提出的解决方案以及其他地方的一些选择/取消选择代码整合到NPM上可用的jquery插件中:
https://www.npmjs.com/package/jquery.text-select
安装:1 2 3 4 5 6 | $(document).ready(function(){ $("#selectMe").selectText(); // Hightlight / select the text $("#selectMe").selectText(false); // Clear the selection $("#copyMe").copyText(); // Copy text to clipboard }); |
有关方法/事件的更多信息,请参见上面的NPM注册页面。