单击按钮使用jQuery复制到剪贴板


433

如何将div中的文本复制到剪贴板?我有一个div,需要添加一个链接,该链接会将文本添加到剪贴板。有解决方案吗?

<p class="content">Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s</p>

<a class="copy-text">copy Text</a>

单击复制文本后,然后按Ctrl+ V,必须将其粘贴。



Trello有一个聪明的办法做到这一点不使用闪光灯: stackoverflow.com/questions/17527870/...
保罗·施雷伯


@MichaelScheper-一些用户甚至足够聪明,注意到我的评论以及此处的大多数答案是四年前发布的,当时基于小型Flash应用程序的zeroclipboard是唯一的跨浏览器可行选项,使用剪贴板和goto解决方案。如今,所有现代浏览器都原生支持此功能,因此不再是问题,但2014
-adeneo

@adeneo:可以,但是并非所有用户都是“智能”用户,您的评论仍然有两个赞。
Michael Scheper '18

Answers:


483

自2016年起编辑

从2016年开始,您现在可以在大多数浏览器中将文本复制到剪贴板,因为大多数浏览器都可以通过编程方式将选择的文本复制到剪贴板document.execCommand("copy"),从而可以将所选内容关闭。

与浏览器中的某些其他操作(例如,打开新窗口)一样,只能通过特定的用户操作(例如,单击鼠标)将内容复制到剪贴板。例如,它不能通过计时器来完成。

这是一个代码示例:

document.getElementById("copyButton").addEventListener("click", function() {
    copyToClipboard(document.getElementById("copyTarget"));
});

function copyToClipboard(elem) {
	  // create hidden text element, if it doesn't already exist
    var targetId = "_hiddenCopyText_";
    var isInput = elem.tagName === "INPUT" || elem.tagName === "TEXTAREA";
    var origSelectionStart, origSelectionEnd;
    if (isInput) {
        // can just use the original source element for the selection and copy
        target = elem;
        origSelectionStart = elem.selectionStart;
        origSelectionEnd = elem.selectionEnd;
    } else {
        // must use a temporary form element for the selection and copy
        target = document.getElementById(targetId);
        if (!target) {
            var target = document.createElement("textarea");
            target.style.position = "absolute";
            target.style.left = "-9999px";
            target.style.top = "0";
            target.id = targetId;
            document.body.appendChild(target);
        }
        target.textContent = elem.textContent;
    }
    // select the content
    var currentFocus = document.activeElement;
    target.focus();
    target.setSelectionRange(0, target.value.length);
    
    // copy the selection
    var succeed;
    try {
    	  succeed = document.execCommand("copy");
    } catch(e) {
        succeed = false;
    }
    // restore original focus
    if (currentFocus && typeof currentFocus.focus === "function") {
        currentFocus.focus();
    }
    
    if (isInput) {
        // restore prior selection
        elem.setSelectionRange(origSelectionStart, origSelectionEnd);
    } else {
        // clear temporary content
        target.textContent = "";
    }
    return succeed;
}
input {
  width: 400px;
}
<input type="text" id="copyTarget" value="Text to Copy"> <button id="copyButton">Copy</button><br><br>
<input type="text" placeholder="Click here and press Ctrl-V to see clipboard contents">


这是一个更高级的演示:https : //jsfiddle.net/jfriend00/v9g1x0o6/

而且,你还可以得到一个预建库,以做到这一点你clipboard.js


答案的历史部分

出于安全原因,任何现代浏览器均不允许通过JavaScript直接复制到剪贴板。最常见的解决方法是使用Flash功能将其复制到剪贴板,这只能由用户直接单击触发。

如前所述,ZeroClipboard是用于管理Flash对象进行复制的常用代码集。我用过了 如果在浏览设备上安装了Flash(排除了移动设备或平板电脑),则它可以正常工作。


下一个最常见的解决方法是将剪贴板上的文本放置在输入字段中,将焦点移到该字段上并建议用户按Ctrl+C复制文本。

可以在以下先前的Stack Overflow帖子中找到有关该问题的其他讨论以及可能的解决方法:


这些要求使用Flash的现代替代方法的问题已经收到很多问题的投票,而没有解决方案的答案(可能是因为不存在):


Internet Explorer和Firefox曾经具有用于访问剪贴板的非标准API,但它们的较新版本已弃用了这些方法(可能出于安全原因)。


一项新兴的标准工作试图尝试一种“安全”的方法来解决最常见的剪贴板问题(可能需要特定的用户操作,如Flash解决方案所要求的),并且看起来它可能在最新的版本中已部分实现。版本的Firefox和Chrome,但我尚未确认。


1
Clipboard.js刚刚添加到了此经编辑的帖子中。这是一个很好的实用工具,我在2015
编码器

1
@acoder-剪贴板支持已定期更改。例如,Firefox仅在最近(2015年末)才document.execCommand("copy")在足够的情况下启用以依赖于此。因此,我正在努力使答案保持最新(最初是大约2年前撰写的)。除了预先选择文本并告诉用户手动按Ctrl + C之外,我们还没有针对Safari的可靠解决方案,但是至少在其他地方已经取得了进展。
jfriend00 '16

1
以下是支持剪贴板API的链接:caniuse.com/#feat=clipboard
L84,

2
仅供参考,每这套Safari浏览器版本说明,看来野生动物园10现在不支持document.execCommand("copy")这样的代码,现在应该在Safari 10.工作
jfriend00

1
@sebastiangodelet-公共领域。
jfriend00

640

更新2020:此解决方案使用execCommand。尽管在编写此答案时该功能还不错,但现在认为它已过时了。它仍然可以在许多浏览器上运行,但是不建议使用它,因为可能会放弃支持。

还有另一种非Flash方式(除了jfriend00的答案中提到的Clipboard API)。您需要选择文本,然后执行命令以将页面上当前选择的任何文本复制到剪贴板。copy

例如,此函数会将传递的元素的内容复制到剪贴板(根据PointZeroTwo的注释中的建议进行更新):

function copyToClipboard(element) {
    var $temp = $("<input>");
    $("body").append($temp);
    $temp.val($(element).text()).select();
    document.execCommand("copy");
    $temp.remove();
}

它是这样工作的:

  1. 创建一个临时隐藏的文本字段。
  2. 将元素的内容复制到该文本字段。
  3. 选择文本字段的内容。
  4. 执行命令副本,例如:document.execCommand("copy")
  5. 删除临时文本字段。

您可以在此处查看快速演示:

function copyToClipboard(element) {
  var $temp = $("<input>");
  $("body").append($temp);
  $temp.val($(element).text()).select();
  document.execCommand("copy");
  $temp.remove();
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<p id="p1">P1: I am paragraph 1</p>
<p id="p2">P2: I am a second paragraph</p>
<button onclick="copyToClipboard('#p1')">Copy P1</button>
<button onclick="copyToClipboard('#p2')">Copy P2</button>
<br/><br/><input type="text" placeholder="Paste here for test" />

主要问题是,目前并非所有浏览器都支持此功能,但您可以从以下主要途径使用它:

  • 镀铬43
  • Internet Explorer 10
  • Firefox 41
  • Safari 10

更新1:这也可以使用纯JavaScript解决方案(没有jQuery)实现:

function copyToClipboard(elementId) {

  // Create a "hidden" input
  var aux = document.createElement("input");

  // Assign it the value of the specified element
  aux.setAttribute("value", document.getElementById(elementId).innerHTML);

  // Append it to the body
  document.body.appendChild(aux);

  // Highlight its content
  aux.select();

  // Copy the highlighted text
  document.execCommand("copy");

  // Remove it from the body
  document.body.removeChild(aux);

}
<p id="p1">P1: I am paragraph 1</p>
<p id="p2">P2: I am a second paragraph</p>
<button onclick="copyToClipboard('p1')">Copy P1</button>
<button onclick="copyToClipboard('p2')">Copy P2</button>
<br/><br/><input type="text" placeholder="Paste here for test" />

注意,我们传递的ID现在没有#号。

正如madzohan在以下评论中所报告的那样,在某些情况下(本地运行文件),64位版本的Google Chrome浏览器存在一些奇怪的问题。上面的非jQuery解决方案似乎已解决了该问题。

Madzohan在Safari中进行了尝试,该解决方案有效,但使用document.execCommand('SelectAll')而不是使用.select()(如聊天室和以下注释中所指定)。

正如PointZeroTwo在注释中指出的那样,可以改进代码,以便返回成功/失败结果。您可以在上看到一个演示此jsFiddle


更新:保留文本格式

正如用户在西班牙语版本的StackOverflow中指出的那样,上面列出的解决方案如果您想按字面意义复制元素的内容,则可以完美地工作,但是,如果您想将复制的文本粘贴为格式(如它被复制到input type="text",格式为“丢失”)。

一种解决方案是将其复制到可编辑的内容中div,然后execCommand以类似方式使用进行复制。这里有一个例子-单击复制按钮,然后粘贴到下面的内容可编辑框中:

function copy(element_id){
  var aux = document.createElement("div");
  aux.setAttribute("contentEditable", true);
  aux.innerHTML = document.getElementById(element_id).innerHTML;
  aux.setAttribute("onfocus", "document.execCommand('selectAll',false,null)"); 
  document.body.appendChild(aux);
  aux.focus();
  document.execCommand("copy");
  document.body.removeChild(aux);
}
#target {
  width:400px;
  height:100px;
  border:1px solid #ccc;
}
<p id="demo"><b>Bold text</b> and <u>underlined text</u>.</p>
<button onclick="copy('demo')">Copy Keeping Format</button> 

<div id="target" contentEditable="true"></div>

在jQuery中,它将是这样的:

function copy(selector){
  var $temp = $("<div>");
  $("body").append($temp);
  $temp.attr("contenteditable", true)
       .html($(selector).html()).select()
       .on("focus", function() { document.execCommand('selectAll',false,null); })
       .focus();
  document.execCommand("copy");
  $temp.remove();
}
#target {
  width:400px;
  height:100px;
  border:1px solid #ccc;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>

<p id="demo"><b>Bold text</b> and <u>underlined text</u>.</p>
<button onclick="copy('#demo')">Copy Keeping Format</button> 

<div id="target" contentEditable="true"></div>


5
奇怪...在这里工作,但我无法在本地工作0o jquery-1.11.3 Chrome 43.0.2357.130(64位)
madzohan 2015年

2
@madzohan好的,我能够重现该问题。这很奇怪,因为我只能在64位Chrome的本地(file://)上复制它。我还找到了一个适用于我的快速解决方案:使用纯JavaScript而不是jQuery。我将用该代码更新答案。请检查它,让我知道它是否适合您。
Alvaro Montoro

1
FWIW-document.execCommand(“ copy”)返回一个布尔值(IE,Chrome,Safari),指示复制是否成功。它可用于在失败时显示错误消息。Firefox在失败时引发异常(至少在v39中),需要try / catch来处理错误。
PointZeroTwo

3
在我通过添加以下几行来确保aux在页面上可见之前,这对我不起作用: aux.style.position = "fixed"; aux.style.top = 0;appendChild调用上方。
ariscris

7
原始的jQuery实现无法保留换行符,因为它使用了INPUT元素。使用TEXTAREA可以解决此问题。
thomasfuchs

37

剪贴板.js是一个很好的实用程序,它允许在不使用Flash的情况下将文本或HTML数据复制到剪贴板。它非常易于使用;只需包含.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上

2016年1月15日修改:今天,对最高答案进行了编辑,以引用我在2015年8月发布的答案中的相同API。先前的文本是指示用户使用ZeroClipboard。只是想清楚一点,我并没有从jfriend00的答案中得出这个结论,反之亦然。



26

简单是最终的复杂性。
如果您不希望看到要复制的文本:

jQuery:

$('button.copyButton').click(function(){
    $(this).siblings('input.linkToCopy').select();      
    document.execCommand("copy");
});

HTML:

<button class="copyButton">click here to copy</button>
<input class="linkToCopy" value="TEXT TO COPY"
style="position: absolute; z-index: -999; opacity: 0;" />

在ipad上似乎无法使用,尚未测试,但建议的解决方案在这里: stackoverflow.com/a/34046084
user1063287 18/09/27

这对我有用,但是如果要复制的文本包含回车符,那么您也可以改用textarea。
Alex

13

带换行符(Alvaro Montoro的答案扩展)

var ClipboardHelper = {

    copyElement: function ($element)
    {
       this.copyText($element.text())
    },
    copyText:function(text) // Linebreaks with \n
    {
        var $tempInput =  $("<textarea>");
        $("body").append($tempInput);
        $tempInput.val(text).select();
        document.execCommand("copy");
        $tempInput.remove();
    }
};

ClipboardHelper.copyText('Hello\nWorld');
ClipboardHelper.copyElement($('body h1').first());

9

您可以通过单击按钮将此代码用于剪贴板中页面的复制输入值

这是HTML

<input type="text" value="xxx" id="link" class="span12" />
<button type="button" class="btn btn-info btn-sm" onclick="copyToClipboard('#link')">
    Copy Input Value
</button>

然后对于此html,我们必须使用此JQuery代码

function copyToClipboard(element) {
    $(element).select();
    document.execCommand("copy");
}

这是此问题的最简单解决方案


8

没有Flash或其他任何要求的更好方法是剪贴板.js。您需要做的就是添加data-clipboard-target="#toCopyElement"任何按钮,对其进行初始化new Clipboard('.btn');,它将复制ID为的DOM的内容。toCopyElement为到剪贴板。这是一个通过链接复制问题中提供的文本的代码段。

尽管有一个限制,但它不能在野生动物园中使用,但由于它不使用Flash,因此可以在包括移动浏览器在内的所有其他浏览器上使用

$(function(){
  new Clipboard('.copy-text');
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script src="https://cdn.jsdelivr.net/clipboard.js/1.5.12/clipboard.min.js"></script>

<p id="content">Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s</p>

<a class="copy-text" data-clipboard-target="#content" href="#">copy Text</a>


5
<!DOCTYPE html>
<html>
<head>
    <title></title>
    <link href="css/index.css" rel="stylesheet" />
    <script src="js/jquery-2.1.4.min.js"></script>
    <script>
        function copy()
        {
            try
            {
                $('#txt').select();
                document.execCommand('copy');
            }
            catch(e)
            {
                alert(e);
            }
        }
    </script>
</head>
<body>
    <h4 align="center">Copy your code</h4>
    <textarea id="txt" style="width:100%;height:300px;"></textarea>
    <br /><br /><br />
    <div align="center"><span class="btn-md" onclick="copy();">copy</span></div>
</body>
</html>

1
这只能用于Textarea和文本框。
Vignesh Chinnaiyan

5
<div class="form-group">
    <label class="font-normal MyText">MyText to copy</label>&nbsp;
    <button type="button" class="btn btn-default btn-xs btnCopy" data="MyText">Copy</button>
</div>


$(".btnCopy").click(function () {
        var element = $(this).attr("data");
        copyToClipboard($('.' + element));
  });

function copyToClipboard(element) {
    var $temp = $("<input>");
    $("body").append($temp);
    $temp.val($(element).text()).select();
    document.execCommand("copy");
    $temp.remove();
}

不错的解决方法。也许添加.addClass("hidden")<input>标签以使其永远不会在浏览器中显示?
罗兰'18

5

输入字段不具有非常重要display: none。浏览器不会选择文本,因此不会被复制。使用opacity: 00px的宽度可解决此问题。


4

这是复制内容的最简单方法

 <div id="content"> Lorepm ispum </div>
 <button class="copy" title="content">Copy Sorce</button>

function SelectContent(element) {
                        var doc = document
                            , text = doc.getElementById(element)
                            , range, selection
                        ;    
                        if (doc.body.createTextRange) {
                            range = document.body.createTextRange();
                            range.moveToElementText(text);
                            range.select();
                        } else if (window.getSelection) {
                            selection = window.getSelection();        
                            range = document.createRange();
                            range.selectNodeContents(text);
                            selection.removeAllRanges();
                            selection.addRange(range);

                        }
                         document.execCommand('Copy');
                    }
                    $(".copy").click(function(){

                         SelectContent( $(this).attr('title'));
                    });

4

jQuery简单解决方案。

应该由用户的点击触发。

$("<textarea/>").appendTo("body").val(text).select().each(function () {
            document.execCommand('copy');
        }).remove();

3

您可以只使用此lib轻松实现复制目标!

https://clipboardjs.com/

将文本复制到剪贴板应该不难。它不需要数十个步骤来配置或加载数百KB。但最重要的是,它不应该依赖Flash或任何肿的框架。

这就是剪贴板.js存在的原因。

要么

https://github.com/zeroclipboard/zeroclipboard

http://zeroclipboard.org/

ZeroClipboard库提供了一种使用不可见的Adobe Flash电影和JavaScript界面​​将文本复制到剪贴板的简便方法。


2

要复制的文本在文本输入中,例如: <input type="text" id="copyText" name="copyText"> 并且,在按钮上单击上方的文本应将其复制到剪贴板,因此按钮如下:<button type="submit" id="copy_button" data-clipboard-target='copyText'>Copy</button> 您的脚本应类似于:

<script language="JavaScript">
$(document).ready(function() {
var clip = new ZeroClipboard($("#copy_button"), {
  moviePath: "ZeroClipboard.swf"
}); 
});

</script>

对于CDN文件

注意ZeroClipboard.swfZeroClipboard.js“文件应与使用此功能的文件位于同一文件夹中,或者您必须像我们<script src=""></script>在页面上那样包含。


6
Flash正在走Geocities的道路。
编码器

2

大部分建议的答案都会创建一个额外的临时隐藏输入元素。因为当今大多数浏览器都支持div内容编辑,所以我提出了一种不创建隐藏元素,保留文本格式并使用纯JavaScript或jQuery库的解决方案。

这是使用我想到最少的代码的极简框架实现:

//Pure javascript implementation:
document.getElementById("copyUsingPureJS").addEventListener("click", function() {
  copyUsingPureJS(document.getElementById("copyTarget"));
  alert("Text Copied to Clipboard Using Pure Javascript");
});

function copyUsingPureJS(element_id) {
  element_id.setAttribute("contentEditable", true);
  element_id.setAttribute("onfocus", "document.execCommand('selectAll',false,null)");
  element_id.focus();
  document.execCommand("copy");
  element_id.removeAttribute("contentEditable");
  
}

//Jquery:
$(document).ready(function() {
  $("#copyUsingJquery").click(function() {
    copyUsingJquery("#copyTarget");
  });
 

  function copyUsingJquery(element_id) {
    $(element_id).attr("contenteditable", true)
      .select()
      .on("focus", function() {
        document.execCommand('selectAll', false, null)
      })
      .focus()
    document.execCommand("Copy");
    $(element_id).removeAttr("contenteditable");
     alert("Text Copied to Clipboard Using jQuery");
  }
});
#copyTarget {
  width: 400px;
  height: 400px;
  border: 1px groove gray;
  color: navy;
  text-align: center;
  box-shadow: 0 4px 8px 0 gray;
}

#copyTarget h1 {
  color: blue;
}

#copyTarget h2 {
  color: red;
}

#copyTarget h3 {
  color: green;
}

#copyTarget h4 {
  color: cyan;
}

#copyTarget h5 {
  color: brown;
}

#copyTarget h6 {
  color: teal;
}

#pasteTarget {
  width: 400px;
  height: 400px;
  border: 1px inset skyblue;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div id="copyTarget">
  <h1>Heading 1</h1>
  <h2>Heading 2</h2>
  <h3>Heading 3</h3>
  <h4>Heading 4</h4>
  <h5>Heading 5</h5>
  <h6>Heading 6</h6>
  <strong>Preserve <em>formatting</em></strong>
  <br/>
</div>

<button id="copyUsingPureJS">Copy Using Pure JavaScript</button>
<button id="copyUsingJquery">Copy Using jQuery</button>
<br><br> Paste Here to See Result
<div id="pasteTarget" contenteditable="true"></div>


2

Clipboard-polyfill库是用于现代基于Promise的异步剪贴板API的polyfill。

在CLI中安装:

npm install clipboard-polyfill 

作为剪贴板导入JS文件

window.clipboard = require('clipboard-polyfill');

我将其与require("babel-polyfill");chrome 67 捆绑使用,并在chrome 67上对其进行了测试。所有这些都非常适合生产。


1

html代码在这里

    <input id="result" style="width:300px"/>some example text
    <button onclick="copyToClipboard('result')">Copy P1</button>
    <input type="text" style="width:400px" placeholder="Paste here for test" />

JS代码:

     function copyToClipboard(elementId) {

                      // Create a "hidden" input
                      var aux = document.createElement("input");

                      aux.setAttribute("value", document.getElementById(elementId).value);
                      // Append it to the body
                      document.body.appendChild(aux);
                      // Highlight its content
                      aux.select();
                      // Copy the highlighted text
                      document.execCommand("copy");
                      // Remove it from the body
                      document.body.removeChild(aux);
                    }

更改此:.value到.innerHTML
Omar N Shamali19年

1

您可以复制HTML元素文本之外的单个文本。

        var copyToClipboard = function (text) {
            var $txt = $('<textarea />');

            $txt.val(text)
                .css({ width: "1px", height: "1px" })
                .appendTo('body');

            $txt.select();

            if (document.execCommand('copy')) {
                $txt.remove();
            }
        };

0

纯JS,没有内联onclick,用于成对的类“内容-复制按钮”。如果您有很多元素,会更舒服)

(function(){

/* Creating textarea only once, but not each time */
let area = document.createElement('textarea');
document.body.appendChild( area );
area.style.display = "none";

let content = document.querySelectorAll('.js-content');
let copy    = document.querySelectorAll('.js-copy');

for( let i = 0; i < copy.length; i++ ){
  copy[i].addEventListener('click', function(){
    area.style.display = "block";
    /* because the classes are paired, we can use the [i] index from the clicked button,
    to get the required text block */
    area.value = content[i].innerText;
    area.select();
    document.execCommand('copy');   
    area.style.display = "none";

    /* decorative part */
    this.innerHTML = 'Cop<span style="color: red;">ied</span>';
    /* arrow function doesn't modify 'this', here it's still the clicked button */
    setTimeout( () => this.innerHTML = "Copy", 2000 );
  });
}

})();
hr { margin: 15px 0; border: none; }
<span class="js-content">1111</span>
<button class="js-copy">Copy</button>
<hr>
<span class="js-content">2222</span>
<button class="js-copy">Copy</button>
<hr>
<span class="js-content">3333</span>
<button class="js-copy">Copy</button>

较旧的浏览器支持:


-1

两者都会像魅力一样工作:),

JAVASCRIPT:

function CopyToClipboard(containerid) {
if (document.selection) { 
    var range = document.body.createTextRange();
    range.moveToElementText(document.getElementById(containerid));
    range.select().createTextRange();
    document.execCommand("copy"); 

} else if (window.getSelection) {
    var range = document.createRange();
     range.selectNode(document.getElementById(containerid));
     window.getSelection().addRange(range);
     document.execCommand("copy");
     alert("text copied") 
}}

同样在html中

<button id="button1" onclick="CopyToClipboard('div1')">Click to copy</button>

<div id="div1" >Text To Copy </div>

<textarea placeholder="Press ctrl+v to Paste the copied text" rows="5" cols="20"></textarea>

JQUERY: https //paulund.co.uk/jquery-copy-clipboard

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.