如何在JavaScript中复制到剪贴板?

如何将文本复制到剪贴板(多浏览器)?

相关:Trello如何访问用户的剪贴板?

2722574 次浏览

据我所知,它只适用于Internet Explorer。

另请参阅动态工具-JavaScript复制到剪贴板,但它要求用户首先更改配置,即使这样它似乎也不起作用。

从网页读取和修改剪贴板会引起安全和隐私问题。但是,在Internet Explorer中,可以做到这一点。我发现这个示例片段

    <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 detectionr.execCommand('copy');}</script><input value="http://www.sajithmr.com"onclick="select_all(this)" name="url" type="text" />

在Internet Explorer以外的浏览器中,您需要使用一个小的Flash对象来操作剪贴板,例如。

其他方法将纯文本复制到剪贴板。要复制超文本标记语言(即,您可以将结果粘贴到所见即所得编辑器中),您可以在Internet Explorer只有中执行以下操作。这与其他方法根本不同,因为浏览器实际上是可见地选择内容。

// Create an editable DIV and append the HTML content you want copiedvar editableDiv = document.createElement("div");with (editableDiv) {contentEditable = true;}editableDiv.appendChild(someContentElement);
// Select the editable content and copy it to the clipboardvar r = document.body.createTextRange();r.moveToElementText(editableDiv);r.select();r.execCommand("Copy");
// Deselect, so the browser doesn't leave the element visibly selectedr.moveToElementText(someHiddenDiv);r.select();

看起来你从G的emonkey\JavaScript复制到剪贴板按钮或这个片段的原始来源获取了代码…

这段代码是为G的emonkey编写的,因此是不安全的窗口。我猜Internet Explorer中的语法错误来自特定于Firefox的const关键字(将其替换为var)。

从Flash 10开始,如果操作源于用户与Flash对象的交互,则只能复制到剪贴板。(阅读Adobe Flash 10公告中的相关部分。)

解决方案是在复制按钮上方覆盖一个Flash对象,或者任何启动复制的元素。ZeroClipboard是目前最好的实现库。经验丰富的Flash开发人员可能只想制作自己的库。

如果您想要一个非常简单的解决方案(集成时间不到5分钟)并且开箱即用,那么Clippy是一些更复杂解决方案的不错选择。

它是由GitHub的联合创始人编写的。下面的示例Flash嵌入代码:

<objectclassid="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}"/><embedsrc="/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>

请记住将#{text}替换为需要复制的文本,并将#{bgcolor}替换为颜色。

我在构建自定义网格编辑(类似Excel)和与Excel的兼容性时遇到了同样的问题。我必须支持选择多个单元格、复制和粘贴。

解决方案:创建一个文本区域,您将在其中插入数据供用户复制(当用户选择单元格时为我),设置焦点(例如,当用户按Ctrl时)并选择整个文本。

因此,当用户点击Ctrl+C时,他/她会复制他/她选择的单元格。经过测试,只需将文本区域的大小调整为一个像素(我没有测试它是否可以在显示上工作:无)。它在所有浏览器上都可以很好地工作,并且对用户是透明的。

粘贴——你可以像这样做(不同于你的目标)——专注于文本区域,并使用粘贴捕捉粘贴事件(在我的项目中,我使用单元格中的文本区域来编辑)。

我不能粘贴一个例子(商业项目),但你明白了。

从我一直在做的一个项目中,一个利用零剪贴板库的jQuery复制到剪贴板插件。

如果你是一个重度jQuery用户,它比原生Zero剪贴板插件更容易使用。

自动复制到剪贴板可能很危险,因此大多数浏览器(Internet Explorer除外)都非常困难。就个人而言,我使用以下简单的技巧:

function copyToClipboard(text) {window.prompt("Copy to clipboard: Ctrl+C, Enter", text);}

用户将看到提示框,其中要复制的文本已被选中。现在只需按Ctrl+C输入(关闭框)即可——瞧!

现在剪贴板复制操作是安全,因为用户手动执行(但以非常简单的方式)。当然,它适用于所有浏览器。

<button id="demo" onclick="copyToClipboard(document.getElementById('demo').innerHTML)">This is what I want to copy</button>
<script>function copyToClipboard(text) {window.prompt("Copy to clipboard: Ctrl+C, Enter", text);}</script>

这是Chase Seibert的回答的扩展,其优点是它适用于IMAGE和TABLE元素,而不仅仅是Internet Explorer 9上的DIV。

if (document.createRange) {// Internet Explorer 9 and modern browsersvar 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 Firefox} else {// Internet Explorer 8 and earlier. This stuff won't work// on Internet Explorer 9.// (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');}

似乎我误解了这个问题,但作为参考,你可以提取DOM的一个范围(不是剪贴板;与所有现代浏览器兼容),并将其与onCopy、onphag和onbepre的事件结合起来,以获得剪贴板的行为。这是实现这一点的代码:

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 areDOM nodes defining the beginning andend of the "selection" respectively.
startOffset and endOffset are constantsthat are defined as follows:
END_TO_END: 2END_TO_START: 3NODE_AFTER: 1NODE_BEFORE: 0NODE_BEFORE_AND_AFTER: 2NODE_INSIDE: 3START_TO_END: 1START_TO_START: 0
And it 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;}}

我找到了以下解决方案:

on-key-down处理程序创建了一个“pre-”标记。我们设置要复制到此标记的内容,然后在此标记上进行选择并在处理程序中返回true。这将调用Chrome的标准处理程序并复制选定的文本。

如果您需要它,您可以设置恢复先前选择的函数的超时时间。我在MooTools上的实现:

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 did 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('Failed to paste. :(');};}

用法:

enyby_clip = new EnybyClipboard(); // Init
enyby_clip.copyText('some_text'); // Place this in the 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;

在粘贴上,它创建一个文本区域并以相同的方式工作。

PS:也许这个解决方案可以用于创建一个没有Flash的完整跨浏览器解决方案。它适用于Firefox和Chrome。

我喜欢这个:

<input onclick="this.select();" type='text' value='copy me' />

如果用户不知道如何在他们的操作系统中复制文本,那么他们很可能也不知道如何粘贴。所以只需自动选择它,其余的留给用户。

如果复制的链接必须粘贴在同一个站点上,那么一个简单的解决方案是在按下简单的超文本标记语言复制按钮之前突出显示文本,然后按下它,文本内容存储在会话中。无论要粘贴到哪里,都有一个粘贴按钮。

**我知道,这不是一个持久和普遍的解决方案,但它是:)

这是同一网站的简单 Ajax/会话剪贴板。

请注意,会话必须启用并有效,并且此解决方案适用于同一站点。我在CodeIgniter上测试了它,但我遇到了会话/Ajax问题,但这个也解决了这个问题。如果你不想玩会话,请使用数据库表。

javascript/jQuery

<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");});});</script>

超文本标记语言内容

<input type='text' id='copy_btn_id' onclick='this.select();'  value='myvalue' /><input type='text' id='paste_btn_id' value='' />

php代码

<?phpclass 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();}}?>

我的错。这只适用于Internet Explorer。

这是另一种复制文本的方法:

<p><a onclick="window.clipboardData.setData('text', document.getElementById('Test').innerText);">Copy</a></p>

如果您在Chrome扩展中从剪贴板读取文本,允许使用“clipboardRead”权限,您可以使用以下代码:

function readTextFromClipboardInChromeExtension() {var ta = $('<textarea/>');$('body').append(ta);ta.focus();document.execCommand('paste');var text = ta.val();ta.blur();ta.remove();return text;}

ZeroClipboard是我发现的最好的跨浏览器解决方案:

<div id="copy" data-clipboard-text="Copy Me!">Click to copy</div><script src="ZeroClipboard.js"></script><script>var clip = new ZeroClipboard( document.getElementById('copy') );</script>

如果您需要对iOS的非Flash支持,只需添加一个后备:

clip.on( 'noflash', function ( client, args ) {$("#copy").click(function(){var txt = $(this).attr('data-clipboard-text');prompt ("Copy link, then click OK.", txt);});});

http://zeroclipboard.org/

https://github.com/zeroclipboard/ZeroClipboard

Chrome您可以使用#0。虽然这不是跨浏览器的(和在代码片段中不起作用?),但您可以将其添加到其他跨浏览器答案中。

我最近写了一个关于这个问题的技术博客文章(我在Lucidchart工作,我们最近对剪贴板进行了大修)。

将纯文本复制到剪贴板相对简单,假设您在系统复制事件期间尝试这样做(用户按下Ctrl+C或使用浏览器的菜单)。

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();});

将文本放在剪贴板上而不是在系统复制事件期间要困难得多。看起来这些其他答案中的一些参考了通过Flash来做到这一点的方法,这是唯一的跨浏览器方法(据我所知)。

除此之外,还有一些基于浏览器的选项。

这是Internet Explorer中最简单的,您可以随时通过JavaScript访问clipboardData对象:

window.clipboardData

(但是,当您尝试在系统剪切、复制或粘贴事件之外执行此操作时,Internet Explorer将提示用户授予Web应用程序剪贴板权限。)

在Chrome,您可以创建一个Chrome扩展,它将为您提供剪贴板权限(这是我们为Lucidchart所做的)。然后,对于安装了您的扩展的用户,您只需要自己触发系统事件:

document.execCommand('copy');

看起来Firefox有一些选择允许用户授予某些站点访问剪贴板的权限,但我个人没有尝试过这些。

出于安全原因,您不能这样做。您必须选择Flash才能复制到剪贴板。

我推荐这个:http://zeroclipboard.org/

概览

有三个主要的浏览器API用于复制到剪贴板:

  1. 异步剪贴板API[navigator.clipboard.writeText]

    • Chrome66(2018年3月)中提供的文本聚焦部分
    • Access是异步的,使用JavaScript Promises,可以写入安全用户提示(如果显示)不会中断页面中的JavaScript。
    • 文本可以直接从变量复制到剪贴板。
    • 仅支持通过HTTPS提供的页面。
    • 在Chrome66页不活动的选项卡可以在没有权限提示的情况下写入剪贴板。
  2. document.execCommand('copy')重写复制事件上的剪贴板API留档。

  3. 允许您从任何复制事件修改剪贴板上显示的内容,可以包括纯文本以外的其他格式的数据。
  4. 这里不涉及,因为它没有直接回答这个问题。

一般发展说明

当您在控制台中测试代码时,不要期望剪贴板相关命令能够工作。通常,页面需要处于活动状态(异步剪贴板API)或需要用户交互(例如用户单击)才能允许(document.execCommand('copy'))访问剪贴板。有关更多详细信息,请参阅下文。

重要(注:2020/02/20)

请注意,由于这篇文章最初是写的弃用跨域IFRAME中的权限和其他IFRAME“沙盒”阻止嵌入式演示“运行代码片段”按钮和“codepen.io示例”在某些浏览器(包括Chrome和Microsoft Edge)中工作。

要开发创建您自己的网页,请通过HTTPS连接提供该页面以进行测试和开发。

这是一个演示代码工作的测试/演示页面:https://deanmarktaylor.github.io/clipboard-test/

异步+回退

由于新的异步剪贴板API的浏览器支持级别,您可能希望退回到document.execCommand('copy')方法以获得良好的浏览器覆盖。

这是一个简单的例子(可能无法在本网站中嵌入,请阅读上面的“重要”注释):

function fallbackCopyTextToClipboard(text) {var textArea = document.createElement("textarea");textArea.value = text;  
// Avoid scrolling to bottomtextArea.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

请注意,可以通过Chrome66中的权限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.exec命令(“复制”)

这篇文章的其余部分将介绍document.execCommand('copy') API的细微差别和细节。

浏览器支持

JavaScript#0支持已经增长,请参阅下面的链接以获取浏览器更新:本文件表示Internet Explorer 5.5+提供了一些支持)。

  • GoogleChrome43+(~2015年4月)
  • Mozilla Firefox 41+(2015年9月发货)
  • Opera 29+(基于Chromium42,~2015年4月)
  • 简单示例

    (可能无法在本网站嵌入工作,阅读上面的“重要”说明)

    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>

    复杂示例:复制到剪贴板而不显示输入

    如果屏幕上有textareainput元素,上面的简单示例非常有效。

    在某些情况下,您可能希望将文本复制到剪贴板而不显示input/textarea元素。这是解决此问题的方法的一个示例(基本上是插入元素、复制到剪贴板、删除元素):

    通过GoogleChrome44、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 the 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 the 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 the 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')调用都必须作为用户操作的直接结果进行,例如单击事件处理程序。这是一种防止在用户意外时弄乱用户剪贴板的措施。

    查看谷歌开发者在这里发帖了解更多信息。

    剪贴板API

    注意,完整的剪贴板API草案规范可以在这里找到:https://w3c.github.io/clipboard-apis/

    是否支持?

    • 如果命令“浏览器支持”,document.queryCommandSupported('copy')应该返回true
    • 如果现在调用document.execCommand('copy')将成功,则document.queryCommandEnabled('copy')返回true。检查以确保命令是从用户启动的线程调用的,并且满足其他要求。

    但是,作为浏览器兼容性问题的一个例子,GoogleChrome从2015年4月到10月,如果命令是从用户启动的线程调用的,则仅从document.queryCommandSupported('copy')返回true

    请注意下面的兼容性详细信息。

    浏览器兼容性详细信息

    虽然对document.execCommand('copy')的简单调用包装在作为用户单击结果调用的try/catch块中将为您提供最大的兼容性,但使用以下有一些条件:

    任何对document.execCommanddocument.queryCommandSupporteddocument.queryCommandEnabled的调用都应该包装在try/catch块中。

    不同的浏览器实现和浏览器版本在调用时抛出不同类型的异常,而不是返回false

    不同的浏览器实现仍在不断变化,剪贴板API仍在草案中,因此请记住进行测试。

    这是其他答案之间的组合。

    var copyToClipboard = function(textToCopy){$("body").append($('<textarea 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来确保输入不显示。例如:

    .textToCopyInput{opacity: 0; position: absolute;}

    或者当然你也可以做一些内联造型

    .append($('<textarea name="fname" style="opacity: 0;  position: absolute;" class="textToCopyInput"/>' )

    clipboard.js是一个小型的非Flash实用程序,允许将文本或超文本标记语言数据复制到剪贴板。它非常易于使用,只需包含. js并使用如下内容:

    <button id='markup-copy'>Copy Button</button>
    <script>document.getElementById('markup-copy').addEventListener('click', function() {clipboard.copy({'text/plain': 'Markup text. Paste me into a rich text editor.','text/html': '<i>here</i> is some <b>rich text</b>'}).then(function(){console.log('success'); },function(err){console.log('failure', err);});
    });</script>

    clipboard.js也在github

    备注:现在已弃用。迁移到这里

    除了院长泰勒的更新答案(2015年7月),我还写了一个jQuery方法,看起来像他的例子。

    jsFiddle

    /*** 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();}};

    2015年更新:目前有一种方法可以使用document.execCommand来处理剪贴板。

    clipboard.js提供了一种跨浏览器的方式来处理剪贴板(浏览器支持)。

    我打算使用clipboard.js,但它还没有任何移动解决方案……所以我写了一个超小型库:

    雪佛兰

    这将复制文本(桌面、Android和Safari10+),或者至少选择文本(旧版本的iOS)。缩小后的文本刚刚超过1 kB。在桌面Safari(版本10之前)中,它告诉用户"按Command+C复制"。您也不需要编写任何JavaScript来使用它。

    我用过clipboard.js.

    我们可以在npm上得到它:

    npm install clipboard --save

    也在鲍尔

    bower install clipboard --save

    new ClipboardJS("#btn1");
    document.querySelector("#btn2").addEventListener("click", () => document.querySelector("#btn1").dataset.clipboardText = Math.random());
    <script src="https://cdn.jsdelivr.net/npm/clipboard@2.0.8/dist/clipboard.min.js"></script>
    <button id="btn1" data-clipboard-text="Text to copy goes here">Copy to clipboard</button><button id="btn2">Click here to change data-clipboard-text</button>
    <br /><br />
    <input type="text" placeholder="Paste here to see clipboard" />

    更多用法和示例在https://zenorocha.github.io/clipboard.js/

    由于Chrome42+和Firefox 41+现在支持document.exec命令(“复制”)命令,我使用Tim Down的老答案谷歌开发者的回答的组合创建了几个跨浏览器复制到剪贴板的功能:

    function selectElementContents(el) {// Copy textarea, pre, div, etc.if (document.body.createTextRange) {// Internet Explorervar textRange = document.body.createTextRange();textRange.moveToElementText(el);textRange.select();textRange.execCommand("Copy");}else if (window.getSelection && document.createRange) {// Non-Internet Explorervar 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 Internet Explorer 4+, Chrome 42+, Firefox 41+, Opera 29+copy_btn.value = "Copy to Clipboard";}else {// Select only for Safari and older Chrome, Firefox and Operacopy_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 thoseversions of Chrome feature detection does not work!See https://code.google.com/p/chromium/issues/detail?id=476508*/
    make_copy_button(document.getElementById("markup"));
    <pre id="markup">Text that can be copied or selected with cross browser support.</pre>

    以下方法适用于Chrome,Firefox,Internet Explorer和Edge以及最新版本的Safari(2016年10月发布的版本10中添加了复制支持)。

    • 创建一个文本区域并将其内容设置为要复制到剪贴板的文本。
    • 将文本区域附加到DOM。
    • 在文本区域中选择文本。
    • 调用document.exec命令(“复制”)
    • 从dom中删除文本区域。

    注意:您不会看到文本区域,因为它是在相同的Javascript代码同步调用中添加和删除的。

    如果您自己正在实现这一点,则需要注意一些事情:

    • 出于安全原因,这只能从事件处理程序(例如Click)调用(就像打开窗口一样)。
    • Internet Explorer将在剪贴板首次更新时显示权限对话框。
    • Internet Explorer和Edge将在文本区域聚焦时滚动。
    • 在某些情况下,execCommand()可能会抛出。
    • 除非您使用文本区域,否则换行符和制表符可能会被吞没。(大多数文章似乎建议使用div)
    • 显示Internet Explorer对话框时,文本区域将可见,您需要隐藏它,或使用Internet Explorer特定的剪贴板数据API。
    • 在Internet Explorer中,系统管理员可以禁用剪贴板API。

    以下功能会尽可能处理的干净利落,发现问题或者有改进建议欢迎评论

    // 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 Internet Explorer 10+.// Internet Explorer: 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) {// Internet Explorer-specific code path to prevent textarea being shown while dialog is visible.return window.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 Microsoft 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 prompt("Copy to clipboard: Ctrl+C, Enter", text);}finally {document.body.removeChild(textarea);}}}

    https://jsfiddle.net/fx6a6n6x/

    搜索支持Safari和其他浏览器(Internet Explorer 9及更高版本)的解决方案后,

    我使用与GitHub相同的:零剪贴板

    示例:

    http://zeroclipboard.org/index-v1.x.html

    超文本标记语言

    <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><script src="main.js"></script></body></html>

    javascript

    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 clickedevent.target.style.display = "none";alert("Copied text to clipboard: " + event.data["text/plain"]);});});

    已经有很多答案了,但是喜欢添加一个(jQuery)。适用于任何浏览器,也适用于移动浏览器(即,关于安全性的提示,但当您接受它时,效果很好)。

    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;}

    在您的代码中:

    if (!appCopyToClipBoard('Hai there! This is copied to the clipboard.')){alert('Sorry, copy to clipboard failed.');}

    我必须从页面中复制非输入框文本(任何div/plan标记中的文本)并想出以下代码。唯一的诀窍是有一个隐藏字段,但作为TEXT类型。它不适用于隐藏类型。

    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.\n\n" + aField.value);aField.hidden = true;}

    在超文本标记语言中添加以下内容:

    input type="text" id="hiddenField" style="width:5px;border:0" />...

    我找到了以下解决方案:

    我在隐藏输入中有文本。因为setSelectionRange不适用于隐藏输入,所以我暂时将类型更改为文本,复制文本,然后再次将其隐藏。如果您想从元素复制文本,您可以将其传递给函数并将其内容保存在目标变量中。

    jQuery('#copy').on('click', function () {copyToClipboard();});
    function copyToClipboard() {var target = jQuery('#hidden_text');
    // Make it visible, so can be focusedtarget.attr('type', 'text');target.focus();// Select all the texttarget[0].setSelectionRange(0, target.val().length);
    // Copy the selectionvar succeed;try {succeed = document.execCommand("copy");}catch (e) {succeed = false;}
    // Hide input againtarget.attr('type', 'hidden');
    return succeed;}

    我在一个简单的解决方案中编译了几个函数,以涵盖所有情况,如果需要,可以立即回退。

    window.copyToClipboard = function(text) {// Internet Explorer specificif (window.clipboardData && window.clipboardData.setData) {return clipboardData.setData("Text", text);}
    // All other modern browserstarget = 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 prompttry {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/

    我已经把@dean-taylor在这里提出的解决方案以及其他地方的一些选择/取消选择代码整合到NPM上可用的jQuery插件中:

    https://www.npmjs.com/package/jquery.text-select

    安装:

    npm install --save jquery.text-select

    用法:

    <script>$(document).ready(function(){$("#selectMe").selectText(); // Hightlight / select the text$("#selectMe").selectText(false); // Clear the selection
    $("#copyMe").copyText(); // Copy text to clipboard});</script>

    有关方法/事件的更多信息可以在上面的NPM注册表页面找到。

    我把我认为最好的放在一起。

    • 使用cssText避免Internet Explorer中的异常,而不是直接设置样式。
    • 恢复选择,如果有一个
    • 设置为只读,这样键盘就不会出现在移动设备上
    • 有一个iOS的解决方法,以便它实际工作,因为它通常会阻止执行命令。

    这里是:

    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 programmatic execCommand copying normally, without this hack.// https://stackoverflow.com/questions/34045777/copy-to-clipboard-using-javascript-in-iosif (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) {console.error(err);return false;}};})();

    用法:copyToClipboard('some text')

    这是最好的。这么多的胜利。

    var toClipboard = function(text) {var doc = document;
    // Create temporary elementvar 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 selectionvar success;try {success = doc.execCommand("copy");}catch(e) {success = false;}
    textarea.remove();
    return success;}

    这是我对那个的看法…

    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;}

    @korayem:请注意,使用htmlinput字段不会尊重换行符\n,并且会将任何文本展平为一行。

    正如@nikksan在评论中提到的,使用textarea将解决以下问题:

    function copy(text) {var input = document.createElement('textarea');input.innerHTML = text;document.body.appendChild(input);input.select();var result = document.execCommand('copy');document.body.removeChild(input);return result;}

    这是我在互联网上查找各种方法后唯一得到的工作。这是一个混乱的话题。世界各地发布了很多解决方案,其中大多数都做了没有工作。这对我很有效:

    注意:此代码仅在作为指向“onClick”方法的直接同步代码执行时才有效。如果您调用对Ajax的异步响应或任何其他异步方式,它将无法工作。

    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();}

    我确实意识到这段代码将在屏幕上可见地显示一个1像素宽的组件一毫秒,但决定不担心这个问题,这是其他人可以解决的问题。

    要将选定的文本(“要复制的文本”)复制到剪贴板,请创建一个书签(执行JavaScript的浏览器书签)并执行它(单击它)。它将创建一个临时文本区域。

    来自GitHub的代码:

    https://gist.github.com/stefanmaric/2abf96c740191cda3bc7a8b0fc905a7d

    (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');

    这是唯一对我有用的东西:

    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');

    使用try/catch使用JavaScript功能,您甚至可以像这样更好地处理错误:

    copyToClipboard() {let el = document.getElementById('Test').innerTextel.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);}}

    将超文本标记语言输入的文本复制到剪贴板:

     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);}
     <!-- The text field --><input type="text" value="Hello Friend" id="myInput">
    <!-- The button used to copy the text --><button onclick="myFunction()">Copy text</button>

    备注:Internet Explorer 9及更早版本不支持#0方法。

    来源将文本复制到剪贴板

    以下是Angular 5. x+的优雅解决方案:

    组件:

    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-iosif (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);}};}

    模板:

    <button class="btn btn-\{\{size}} btn-\{\{theme}}" type="button" (click)="copyToClipboard()"><ng-content></ng-content></button>
    <input #input class="hidden-input" [ngModel]="content">

    样式:

    .hidden-input {position: fixed;top: 0;left: 0;width: 1px;height: 1px;padding: 0;border: 0;box-shadow: none;outline: none;background: transparent;}

    以下是我的解决方案:

    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();}

    我使用这个非常成功(没有 jQuery或任何其他框架)。

    function copyToClp(txt){var m = document;txt = m.createTextNode(txt);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)。

    在2018年,你可以这样做:

    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);}}

    它在我的Angular 6+代码中使用,如下所示:

    <button mat-menu-item (click)="copySomething()"><span>Copy link</span></button>

    如果我传入一个字符串,它会复制它。如果没有,它会复制页面的URL。

    更多的体操到剪贴板的东西也可以完成。在这里查看更多信息:

    解锁剪贴板访问

    这个可以可以通过使用getElementbyId、选择()、blur()和复制命令的组合来完成。

    说明

    选择()方法选择元素或带有文本字段的元素中的所有文本。这可能不适用于按钮。

    用法

    let copyText = document.getElementById('input-field');copyText.select()document.execCommand("copy");copyReferal.blur()document.getElementbyId('help-text').textContent = 'Copied'

    blur()方法将删除丑陋的突出显示部分,而不是您可以在漂亮的消息中显示您的内容已成功复制

    使用document.execCommand将为您完成工作…

    使用它,您还可以执行削减复制

    这是一个简单的剪贴板复制功能,可以复制输入文本中的所有内容…

    function copyInputText() {var copyText = document.querySelector("#input");copyText.select();document.execCommand("copy");}
    document.querySelector("#copy").addEventListener("click", copyInputText);
    <input id="input" type="text" /><button id="copy">Copy</button>

    有关详细信息,请参阅与剪贴板交互(加载项)。

    我尝试了许多解决方案。如果它适用于现代浏览器,它不会在Internet Explorer中运行。如果它适用于Internet Explorer,它不会在iOS上运行。我终于对它们进行了梳理,并得到了以下修复,适用于所有浏览器,iOS,webview和Android。

    注意:我还介绍了用户拒绝剪贴板权限的情况。此外,即使用户手动复制,也会显示消息“链接已复制”。

    <div class="form-group col-md-12"><div class="input-group col-md-9"><input name="copyurl"type="text"class="form-control br-0 no-focus"id="invite-url"placeholder="http://www.invitelink.com/example"readonly><span class="input-group-addon" id="copy-link" title="Click here to copy the invite link"><i class="fa fa-clone txt-18 text-success" aria-hidden="true"></i></span></div><span class="text-success copy-success hidden">Link copied.</span></div>

    脚本:

    var addEvent =  window.attachEvent || window.addEventListener;var event = 'copy';var $inviteUrl = $('#invite-url');
    $('#copy-link').on('click', function(e) {if ($inviteUrl.val()) {if (navigator.userAgent.match(/ipad|ipod|iphone/i)) {var el = $inviteUrl.get(0);var editable = el.contentEditable;var readOnly = el.readOnly;el.contentEditable = true;el.readOnly = false;var range = document.createRange();range.selectNodeContents(el);var sel = window.getSelection();sel.removeAllRanges();sel.addRange(range);el.setSelectionRange(0, 999999);el.contentEditable = editable;el.readOnly = readOnly;document.execCommand('copy');$inviteUrl.blur();}else {$inviteUrl.select();document.execCommand("copy");}}});
    addEvent(event, function(event) {if ($inviteUrl.val() && event.target.id == 'invite-url') {var $copyLink = $('#copy-link i');$copyLink.removeClass('fa-clone');$copyLink.addClass('fa-check');$('.copy-success').removeClass('hidden');setTimeout(function() {$copyLink.removeClass('fa-check');$copyLink.addClass('fa-clone');$('.copy-success').addClass('hidden');}, 2000);}});

    这是一个简单的例子;)

    <!DOCTYPE html><html><body><input type="text"value="Hello, World!"id="myInput"><button onclick="myFunction()">Copy text</button>
    <p>The document.execCommand() method is not supportedin Internet&nbsp;Explorer&nbsp;8 and earlier.</p>
    <script>function myFunction() {var copyText = document.getElementById("myInput");copyText.select();document.execCommand("copy");alert("Copied the text: " + copyText.value);}</script></body></html>

    这是一个独立的类,通过将临时textarea放置在屏幕外,确保不会发生闪烁。

    这适用于Safari(桌面),Firefox和Chrome。

    // ================================================================================// ClipboardClass// ================================================================================var ClipboardClass = (function() {
    function copyText(text) {// Create a temporary element off-screen to hold text.var tempElem = $('<textarea style="position: absolute; top: -8888px; left: -8888px">');$("body").append(tempElem);
    tempElem.val(text).select();document.execCommand("copy");tempElem.remove();}
    
    // ============================================================================// Class API// ============================================================================return {copyText: copyText};
    })();
    function copytoclipboard(element) {
    var $temp = $("<input>");$("body").append($temp);$temp.val('0' + element).select();document.execCommand("copy");$temp.remove();}

        $("td").click(function (e) {var clickedCell = $(e.target).closest("td");navigator.clipboard.writeText(clickedCell.text());alert(clickedCell.text());});
    <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script><table><tr><td>First<td></tr><tr><td>Second<td></tr><tr><td>Third<td></tr><tr><td>Fourth<td></tr></table>

    我已经阅读了所有的答案,截至2020年6月1日,当我终于找到留档时,我一直在努力解决这个问题:

    $("td").click(function (e) {var clickedCell = $(e.target).closest("td");navigator.clipboard.writeText(clickedCell.text());});

    它会将单击的单元格文本写入浏览器剪贴板。

    您可以为任何您想要的内容更改选择器“td”,您可以添加console.log用于调试和/或警报功能。

    留档:https://developer.mozilla.org/en-US/docs/Web/API/Clipboard/writeText

    document.querySelector('#some_your_textfield_id').select();document.execCommand('copy');

    第一行是选择要复制的文本。

    第二行是复制选定的文本。

    此解决方案已找到这里。Internet Explorer 8及更早版本不支持document.execCommand("copy");

    const copyBtn =  document.getElementById("copyBtn");const input = document.getElementById("input");
    function copyText() {const value = input.value;  
    input.select(); // selects the input variable as the text to be copiedinput.setSelectionRange(0, 99999); // this is used to set the selection range for mobile devices  
    document.execCommand("copy"); // copies the selected text  
    alert("Copied the text " + value); // displays the copied text in a prompt}
    copyBtn.onmousedown = function () {copyText();}
    <input type="text" id="input" placeholder="Type text to copy... "/><button id="copyBtn">Copy</button>

    简单、即用且不过时的解决方案:

    function copyToClipboard(elementIdToCopy, elementIdToNotifyOutcome) {const contentToCopy = document.getElementById(elementIdToCopy).innerHTML;const elementToNotifyOutcome = document.getElementById(elementIdToNotifyOutcome);
    navigator.clipboard.writeText(contentToCopy).then(function() {elementToNotifyOutcome.classList.add('success');elementToNotifyOutcome.innerHTML = 'Copied!';}, function() {elementToNotifyOutcome.classList.add('failure');elementToNotifyOutcome.innerHTML = 'Sorry, did not work.';});}

    以下函数可用于复制到剪贴板:

    copyToclipboard = (event, text) => {var container = event.currentTarget;let tempInnerHtml = container.innerHTML;container.innerHTML = text;window.getSelection().removeAllRanges();let range = document.createRange();range.selectNode(container);window.getSelection().addRange(range);document.execCommand('copy');window.getSelection().removeAllRanges();container.innerHTML = tempInnerHtml;}

    这可能是解决你问题的办法

    function CopyToNotepad(id){var r = document.createRange();r.selectNode(document.getElementById(id));window.getSelection().removeAllRanges();window.getSelection().addRange(r);document.execCommand('copy');window.getSelection().removeAllRanges();}

    注意:id应该是您要复制内容的父元素id。例如:假设您想复制列表中的每个内容,那么应该使用id如下:

    <ul id="dummy_id"><li>copy content 1 </li><li>copy content 2 </li><li>copy content 3 </li><li>copy content 4 </li><li>copy content 5 </li></ul>

    那么函数调用应该是这样的

    复制到记事本(dummy_id)

    谢谢,这肯定能解决你的问题!

    此代码测试@2021 May。在Chrome、IE、Edge上工作。下面的“消息”参数是您要复制的字符串值。

    <script type="text/javascript">function copyToClipboard(message) {var textArea = document.createElement("textarea");textArea.value = message;textArea.style.opacity = "0";document.body.appendChild(textArea);textArea.focus();textArea.select();
    
    try {var successful = document.execCommand('copy');var msg = successful ? 'successful' : 'unsuccessful';alert('Copying text command was ' + msg);} catch (err) {alert('Unable to copy value , error : ' + err.message);}
    document.body.removeChild(textArea);}
    </script>

    除了Dean Taylor的回答之外,这里有一个简短的答案和一个很长的答案,所以你可以复制适合你需要的函数:

    简短回答:

    使用navigator.clipboard.writeText(str)

    caniuse.com上的剪贴板API

    长答案:

        // Copies a string to clipboard// Uses navigator API if available, else uses execCommand (deprecated)// Returns a boolean if copy was successful// See: https://stackoverflow.com/q/400212/4907950async function copyText(str) {console.log('Copying', str);if (!navigator.clipboard) {// fallbacklet input = document.createElement('textarea');input.innerHTML = str;document.body.appendChild(input);input.focus();input.select();let result;
    try {result = document.execCommand('copy');console.log('Fallback: Copying text command was ' + (result ? 'successful' : 'unsuccessful'));} catch (err) {console.error('Fallback: Could not copy text: ', err);}document.body.removeChild(input);return result;}const result = navigator.clipboard.writeText(str).then(function () {console.log('Async: Copying to clipboard was successful');return true;},function (err) {console.error('Async: Could not copy text: ', err);return false;});return result;

    尝试使用此功能

    const copyToClipboard = (value,successfully = () => null,failure = () => null) => {const clipboard = navigator.clipboard;if (clipboard !== undefined && clipboard !== "undefined") {navigator.clipboard.writeText(value).then(successfully, failure);} else {if (document.execCommand) {const el = document.createElement("input");el.value = value;document.body.append(el);
    el.select();el.setSelectionRange(0, value.length);
    if (document.execCommand("copy")) {successfully();}
    el.remove();} else {failure();}}};

    复制文本字段内文本的最佳方法。使用navigator.clipboard.write文本

    <input type="text" value="Hello World" id="myId"><button onclick="myFunction()" >Copy text</button>
    <script>function myFunction() {var copyText = document.getElementById("myId");copyText.select();copyText.setSelectionRange(0, 99999);navigator.clipboard.writeText(copyText.value);}
    </script>

    Stackoverflow的解决方案

    我只是想指出Stackoverflow实际上是这样做的。在每个答案下方都有一个“共享”链接——当你单击该链接时,它会打开一个弹出窗口,其中输入中突出显示了共享链接,以及一个“复制链接”链接:

    在此处输入图片描述

    如果您转到ChromeDevTools并转到事件监听器以获取该链接,您可以找到他们使用的函数。它被称为tryCopy():

    在此处输入图片描述

    这与泰勒院长在这里回答(最近更新)完全一致-特别阅读标题为异步+回退的部分。太长别读:尝试使用navigator.clipboard api-如果浏览器不支持,请回退到document.execCommand()。

    在JavaScript/TypeScript中使用此命令的最佳和简单方法

    navigator.clipboard.writeText(textExample);

    只需将您想要复制到剪贴板中的值传递给文本示例

    这是我找到的最简单的方法

    <!DOCTYPE html><html><body>
    <p>Click on the button to copy the text from the text field. Try to pastethe text (e.g. ctrl+v) afterwards in a different window, to see the effect.</p>
    <input type="text" value="Hello World" id="myInput"><button onclick="myFunction()">Copy text</button>
    <script>function myFunction() {/* Get the text field */var copyText = document.getElementById("myInput");
    /* Select the text field */copyText.select();copyText.setSelectionRange(0, 99999); /* For mobile devices */
    /* Copy the text inside the text field */navigator.clipboard.writeText(copyText.value);
    /* Alert the copied text */alert("Copied the text: " + copyText.value);}
    </script>
    </body></html>

    这可以立即工作,使用最新的剪贴板API和用户交互:

    copy.addEventListener("pointerdown", () => navigator.clipboard.writeText("Hello World!"))
    <button id="copy">Copy Hello World!</button>

    这是我根据每个人的答案对答案的看法。请注意,这个答案考虑了几件事:

    1. 确保navigator.clipboard.writeText()是复制的主要方式
    2. 确保使用现代JS正确解决writeText() Promise——按照2022年。

       async function copyText(e) {const elem = e.currentTarget;const text = elem.textContent;try {await navigator.clipboard.writeText(text);elem.textContent = "Copied to Clipboard!";} catch (err) {//use document.execCommand('copy') as fallbackconst textArea = document.createElement("textarea");textArea.value = text;document.body.appendChild(textArea);textArea.focus();textArea.select();document.execCommand("copy");elem.textContent = "Copied to Clipboard!";document.body.removeChild(textArea);} finally {setTimeout(() => {elem.textContent = text;}, 2000);}}document.querySelector(".target-elem-whatever").addEventListener("click", copyText);
    <button class="target-elem-whatever">This text should be inside your clipboard.</button>

    这很简单。您可以在函数旁边使用导航器。之后,您只需如何复制指定的文本即可。我通常这样做:

    <div id="mybox">Hello World</div>
    <script>const _ = (id) => { return document.getElementById(id) }
    const copy = (text) => {navigator.clipboard.writeText(text)alert('Copied to clipboard');}
    _('mybox').addEventListener('click', () => {let text = _('mybox').innerText;copy(text);});</script>

    我不愿意在这个问题上添加另一个答案,但为了帮助像我这样的新手,因为这是我将在谷歌上获得的最高结果。

    2022年,要将文本复制到您使用的剪贴板一条线

    navigator.clipboard.writeText(textToCopy);

    这将返回一个Promise,如果它复制则解析,如果它失败则拒绝。

    完整的工作功能是这样的:

    async function copyTextToClipboard(textToCopy) {try {await navigator.clipboard.writeText(textToCopy);console.log('copied to clipboard')} catch (error) {console.log('failed to copy to clipboard. error=' + error);}}

    警告!如果您在测试时打开Chrome开发工具,它将失败,因为浏览器要启用剪贴板,它需要您将窗口对焦。这是为了防止随机网站在您不想要的情况下更改剪贴板。开发工具窃取此焦点如此接近开发工具,您的测试将正常工作。

    如果您想将其他内容(图像等)复制到剪贴板,请查看这些文档。

    https://developer.mozilla.org/en-US/docs/Web/API/Clipboard_API

    这在浏览器中得到了很好的支持,您可以使用它。如果您担心Firefox,请使用权限查询来显示或隐藏按钮(如果浏览器支持它)。https://developer.mozilla.org/en-US/docs/Web/API/Permissions/query

    试试这个

    简单复制JS

    复制文本 #拷贝函数#拷贝函数//获取文本字段document.getElementById("text_to_copy");navigator.clipboard.write文本(copyText.inner文本),然后( () => { 警告(“复制”);},() => { 警告(“未复制”);}); }

    这段代码修复了兼容性问题、未授予权限问题、异步问题和AppleSafari问题,这些问题不能很好地与writeText一起工作我在最近的堆栈溢流柱中描述了所有这些问题。

    function copy(text) {return new Promise((resolve, reject) => {if (typeof navigator !== "undefined" && typeof navigator.clipboard !== "undefined" && navigator.permissions !== "undefined") {const type = "text/plain";const blob = new Blob([text], { type });const data = [new ClipboardItem({ [type]: blob })];navigator.permissions.query({name: "clipboard-write"}).then((permission) => {if (permission.state === "granted" || permission.state === "prompt") {navigator.clipboard.write(data).then(resolve, reject).catch(reject);}else {reject(new Error("Permission not granted!"));}});}else if (document.queryCommandSupported && document.queryCommandSupported("copy")) {var textarea = document.createElement("textarea");textarea.textContent = text;textarea.style.position = "fixed";textarea.style.width = '2em';textarea.style.height = '2em';textarea.style.padding = 0;textarea.style.border = 'none';textarea.style.outline = 'none';textarea.style.boxShadow = 'none';textarea.style.background = 'transparent';document.body.appendChild(textarea);textarea.focus();textarea.select();try {document.execCommand("copy");document.body.removeChild(textarea);resolve();}catch (e) {document.body.removeChild(textarea);reject(e);}}else {reject(new Error("None of copying methods are supported by this browser!"));}});    
    }

    用法

    try {await copy("Hay yah!");}catch(e) {console.error(e);}

    重要提示:通过按钮和onClick事件测试它,而不是在控制台中。

    尝试使用这个:

    <a href="#" onclick="copyToClipboard('what the foo')">click</a>
    <script>function copyToClipboard(value) {navigator.clipboard.writeText(value)}</script>