Nhấn vào nút sao chép vào clipboard bằng jQuery


432

Làm cách nào để sao chép văn bản bên trong div vào bảng tạm? Tôi có một div và cần thêm một liên kết sẽ thêm văn bản vào clipboard. đó có phải là cách giải quyết?

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

Sau khi tôi nhấp vào sao chép văn bản, sau đó tôi nhấn Ctrl+ V, nó phải được dán.



Trello có một cách thông minh để làm điều này mà không cần flash: stackoverflow.com/questions/17527870/iêu
Paul Schreiber

Tham khảo điều này, stackoverflow.com/questions/22581345/ nhận được giải pháp mong đợi bằng cách sử dụng JavaScript thuần túy
Vignesh Chinnaiyan

@MichaelScheper - một số người dùng thậm chí đủ thông minh để nhận thấy rằng nhận xét của tôi và hầu hết các câu trả lời ở đây, đã được đăng hơn bốn năm trước, khi zeroclipboard, dựa trên một ứng dụng flash nhỏ, là lựa chọn khả thi trên trình duyệt chéo duy nhất để làm việc với clipboard và giải pháp goto. Ngày nay, tất cả các trình duyệt hiện đại đều hỗ trợ điều này một cách tự nhiên, vì vậy nó không còn là vấn đề nữa, nhưng đó không phải là trường hợp trong năm 2014
adeneo

@adeneo: Chắc chắn, nhưng không phải tất cả người dùng đều 'thông minh' và nhận xét của bạn vẫn có hai điểm nâng cao.
Michael Scheper

Câu trả lời:


483

Chỉnh sửa vào năm 2016

Kể từ năm 2016, giờ đây bạn có thể sao chép văn bản vào bảng tạm trong hầu hết các trình duyệt vì hầu hết các trình duyệt có khả năng sao chép một cách lập trình một lựa chọn văn bản vào bảng tạm bằng cách sử dụng document.execCommand("copy")một lựa chọn.

Cũng như một số hành động khác trong trình duyệt (như mở một cửa sổ mới), việc sao chép vào bảng tạm chỉ có thể được thực hiện thông qua một hành động người dùng cụ thể (như nhấp chuột). Ví dụ, nó không thể được thực hiện thông qua một bộ đếm thời gian.

Đây là một ví dụ mã:

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">


Đây là bản demo nâng cao hơn một chút: https://jsfiddle.net/jfriend00/v9g1x0o6/

Và, bạn cũng có thể có được một thư viện dựng sẵn thực hiện điều này cho bạn với clipboard.js .


Phần cũ, phần lịch sử của câu trả lời

Sao chép trực tiếp vào clipboard qua JavaScript không được phép bởi bất kỳ trình duyệt hiện đại nào vì lý do bảo mật. Cách giải quyết phổ biến nhất là sử dụng khả năng Flash để sao chép vào bảng tạm mà chỉ có thể được kích hoạt bằng cách nhấp trực tiếp của người dùng.

Như đã đề cập, ZeroClipboard là một bộ mã phổ biến để quản lý đối tượng Flash để thực hiện sao chép. Tôi đã sử dụng nó. Nếu Flash được cài đặt trên thiết bị duyệt (loại trừ điện thoại di động hoặc máy tính bảng), nó sẽ hoạt động.


Cách giải quyết phổ biến tiếp theo là chỉ đặt văn bản giới hạn trong bảng tạm vào trường nhập, di chuyển tiêu điểm đến trường đó và khuyên người dùng nhấn Ctrl+ Cđể sao chép văn bản.

Các cuộc thảo luận khác về vấn đề và các cách giải quyết có thể có thể được tìm thấy trong các bài đăng Stack Overflow trước đây:


Những câu hỏi yêu cầu một giải pháp thay thế hiện đại cho việc sử dụng Flash đã nhận được rất nhiều câu hỏi và không có câu trả lời với một giải pháp (có lẽ vì không tồn tại):


Internet Explorer và Firefox từng có các API không chuẩn để truy cập vào bảng tạm, nhưng các phiên bản hiện đại hơn của chúng đã không dùng các phương thức đó (có thể vì lý do bảo mật).


Có một nỗ lực tiêu chuẩn non trẻ để cố gắng đưa ra một cách "an toàn" để giải quyết các vấn đề về clipboard phổ biến nhất (có thể yêu cầu một hành động cụ thể của người dùng như giải pháp Flash yêu cầu) và có vẻ như nó có thể được thực hiện một phần mới nhất phiên bản Firefox và Chrome, nhưng tôi chưa xác nhận điều đó.


1
clipboard.js vừa được thêm vào bài chỉnh sửa này. Đó là một tiện ích tốt mà tôi đưa vào như một câu trả lời cho câu hỏi này vào tháng 8 năm 2015.
một lập trình viên

1
@acoder - Hỗ trợ Clipboard đã thay đổi thường xuyên. Ví dụ: Firefox chỉ gần đây (cuối năm 2015) đã kích hoạt document.execCommand("copy")trong các trường hợp đủ để dựa vào việc sử dụng nó cho việc này. Vì vậy, tôi đang nỗ lực để giữ cho câu trả lời của tôi được cập nhật (mà ban đầu là tác giả gần 2 năm trước). Chúng tôi vẫn chưa có giải pháp đáng tin cậy cho Safari ngoài việc chọn trước văn bản và yêu cầu người dùng nhấn Ctrl + C theo cách thủ công, nhưng ít nhất tiến trình đang được thực hiện ở nơi khác.
jfriend00

1
Đây là liên kết để hỗ trợ API Clipboard: caniuse.com/#feat=clipboard
L84

2
FYI, trên mỗi bộ ghi chú phát hành Safari này , có vẻ như Safari 10 hiện đã hỗ trợ document.execCommand("copy")nên mã này sẽ hoạt động trong Safari 10.
jfriend00

1
@sebastiangodelet - miền công cộng.
jfriend00

639

Cập nhật 2020 : Giải pháp này sử dụng execCommand. Mặc dù tính năng đó vẫn ổn tại thời điểm viết câu trả lời này, nhưng hiện tại nó được coi là lỗi thời . Nó vẫn sẽ hoạt động trên nhiều trình duyệt, nhưng việc sử dụng nó không được khuyến khích vì có thể bỏ hỗ trợ.

Có một cách khác không phải là Flash (ngoài API Clipboard được đề cập trong câu trả lời của jfriend00 ). Bạn cần chọn văn bản và sau đó thực hiện lệnhcopy để sao chép vào bảng tạm bất cứ văn bản nào hiện đang được chọn trên trang.

Ví dụ: chức năng này sẽ sao chép nội dung của phần tử được truyền vào bảng tạm (được cập nhật với gợi ý trong các nhận xét từ PointZeroTwo ):

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

Đây là cách nó hoạt động:

  1. Tạo một trường văn bản tạm thời bị ẩn.
  2. Sao chép nội dung của phần tử vào trường văn bản đó.
  3. Chọn nội dung của trường văn bản.
  4. Thực thi bản sao lệnh như : document.execCommand("copy").
  5. Loại bỏ trường văn bản tạm thời.

Bạn có thể xem bản demo nhanh tại đây:

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" />

Vấn đề chính là không phải tất cả các trình duyệt đều hỗ trợ tính năng này vào lúc này, nhưng bạn có thể sử dụng nó trên các trình duyệt chính từ:

  • Chrome 43
  • Internet Explorer 10
  • Firefox 41
  • Safari 10

Cập nhật 1: Điều này cũng có thể đạt được với một giải pháp JavaScript thuần túy (không có 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" />

Lưu ý rằng chúng tôi vượt qua id mà không có # ngay bây giờ.

Như madzohan đã báo cáo trong các bình luận bên dưới, có một số vấn đề lạ với phiên bản Google Chrome 64 bit trong một số trường hợp (chạy tệp cục bộ). Vấn đề này dường như được khắc phục với giải pháp không phải jQuery ở trên.

Madzohan đã thử trong Safari và giải pháp đã hoạt động nhưng sử dụng document.execCommand('SelectAll')thay vì sử dụng .select()(như được chỉ định trong trò chuyện và trong các nhận xét bên dưới).

Như PointZeroTwo chỉ ra trong các bình luận , mã có thể được cải thiện để nó sẽ trả về kết quả thành công / thất bại. Bạn có thể xem bản demo trên jsFiddle này .


CẬP NHẬT: SAO CHÉP GIỮ CÁC HÌNH THỨC VĂN BẢN

Như một người dùng đã chỉ ra trong phiên bản tiếng Tây Ban Nha của StackOverflow , các giải pháp được liệt kê ở trên hoạt động hoàn hảo nếu bạn muốn sao chép nội dung của một phần tử theo nghĩa đen, nhưng chúng không hoạt động tuyệt vời nếu bạn muốn dán văn bản được sao chép với định dạng (như nó được sao chép vào một input type="text", định dạng là "mất").

Một giải pháp cho điều đó sẽ là sao chép vào một nội dung có thể chỉnh sửa divvà sau đó sao chép nó bằng cách execCommandtương tự. Ở đây có một ví dụ - nhấp vào nút sao chép và sau đó dán vào hộp có thể chỉnh sửa nội dung bên dưới:

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>

Và trong jQuery, nó sẽ như thế này:

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
lạ ... ở đây nó hoạt động, nhưng tôi không thể làm việc tại địa phương 0o jquery-1.11.3 Chrome 43.0.2357.130 (64-bit)
madzohan

2
@madzohan Ok, tôi đã có thể tái tạo vấn đề. Thật kỳ lạ vì tôi chỉ có thể sao chép nó trên cục bộ (tệp: //) trên Chrome 64 bit. Tôi cũng tìm thấy một giải pháp nhanh chóng phù hợp với mình: sử dụng JavaScript đơn giản thay vì jQuery. Tôi sẽ cập nhật câu trả lời với mã đó. Vui lòng kiểm tra và cho tôi biết nếu nó hoạt động cho bạn.
Alvaro Montoro

1
FWIW - document.execCommand ("copy") trả về một boolean (IE, Chrome, Safari) cho biết liệu bản sao có thành công hay không. Nó có thể được sử dụng để hiển thị một thông báo lỗi khi thất bại. Firefox đưa ra một ngoại lệ về lỗi (ít nhất là trong v39), yêu cầu thử / bắt để xử lý lỗi.
PointZeroTwo

3
Điều này không hiệu quả với tôi cho đến khi tôi chắc chắn rằng có thể nhìn thấy được trên trang bằng cách thêm các dòng sau: aux.style.position = "fixed"; aux.style.top = 0;phía trên appendChildcuộc gọi.
ariscris

7
Việc triển khai jQuery ban đầu không bảo toàn ngắt dòng, vì nó đang sử dụng phần tử INPUT. Sử dụng một văn bản thay thế giải quyết điều này.
thomasfuchs

37

clipboard.js là một tiện ích đẹp cho phép sao chép dữ liệu văn bản hoặc dữ liệu HTML vào bảng tạm mà không cần sử dụng Flash. Nó rất dễ sử dụng; chỉ bao gồm .js và sử dụng cái gì đó như thế này:

<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 cũng có trên GitHub .

Chỉnh sửa vào ngày 15 tháng 1 năm 2016: Câu trả lời hàng đầu đã được chỉnh sửa ngày hôm nay để tham khảo cùng API trong câu trả lời của tôi được đăng vào tháng 8 năm 2015. Văn bản trước đó đã hướng dẫn người dùng sử dụng ZeroClipboard. Chỉ muốn rõ ràng rằng tôi đã không nhận được điều này từ câu trả lời của jfriend00, thay vào đó là cách khác.


clipboard-js - đã không được chấp nhận Thông báo của tác giả: Vui lòng di chuyển đến github.com/lgarron/clipboard-polyfill
Yevgeniy Afanasyev

26

Đơn giản là sự tinh tế cuối cùng.
Nếu bạn không muốn hiển thị văn bản tương tự:

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;" />

dường như không hoạt động trên ipad, chưa được thử nghiệm nhưng một giải pháp được đề xuất là ở đây: stackoverflow.com/a/34046084
user1063287

Điều đó làm việc cho tôi, nhưng nếu văn bản được sao chép có chứa lợi nhuận vận chuyển thì bạn cũng có thể sử dụng một văn bản thay thế.
Alex

13

Với ngắt dòng (Mở rộng câu trả lời từ 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

Bạn có thể sử dụng mã này để sao chép giá trị đầu vào trong trang trong Clipboard bằng cách nhấp vào nút

Đây là 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>

Sau đó, đối với html này, chúng ta phải sử dụng Mã JQuery này

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

Đây là giải pháp đơn giản nhất cho câu hỏi này


8

Cách tiếp cận thậm chí tốt hơn mà không cần flash hoặc bất kỳ yêu cầu nào khác là clipboard.js . Tất cả những gì bạn cần làm là thêm data-clipboard-target="#toCopyElement"vào bất kỳ nút nào, khởi tạo nó new Clipboard('.btn');và nó sẽ sao chép nội dung của DOM với id toCopyElementvào clipboard. Đây là một đoạn sao chép văn bản được cung cấp trong câu hỏi của bạn thông qua một liên kết.

Một hạn chế là nó không hoạt động trên safari, nhưng nó hoạt động trên tất cả các trình duyệt khác bao gồm cả các trình duyệt di động vì nó không sử dụng 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
Điều này chỉ có thể được sử dụng cho Textarea và textbox.
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();
}

Cách giải quyết tốt đẹp. Có thể thêm .addClass("hidden")vào <input>thẻ để nó không bao giờ xuất hiện trong trình duyệt?
Roland

5

Điều rất quan trọng là trường đầu vào không có display: none. Trình duyệt sẽ không chọn văn bản và do đó sẽ không được sao chép. Sử dụng opacity: 0với chiều rộng 0px để khắc phục sự cố.


4

Đây là một phương pháp đơn giản nhất để sao chép nội dung

 <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

Giải pháp đơn giản của jQuery.

Nên được kích hoạt bởi nhấp chuột của người dùng.

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

3

bạn chỉ có thể sử dụng lib này để dễ dàng nhận ra mục tiêu sao chép!

https://clipboardjs.com/

Sao chép văn bản vào clipboard không khó. Không cần hàng chục bước để định cấu hình hoặc tải hàng trăm KB. Nhưng trên hết, nó không nên phụ thuộc vào Flash hoặc bất kỳ khuôn khổ cồng kềnh nào.

Đó là lý do tại sao clipboard.js tồn tại.

hoặc là

https://github.com/zeroclipboard/zeroclipboard

http://zeroclipboard.org/

Thư viện ZeroClipboard cung cấp một cách dễ dàng để sao chép văn bản vào bảng tạm bằng cách sử dụng phim Adobe Flash vô hình và giao diện JavaScript.


2

Văn bản cần sao chép nằm trong kiểu nhập văn bản, như: <input type="text" id="copyText" name="copyText"> và trên nút bấm vào văn bản trên sẽ được sao chép vào bảng tạm, vì vậy nút này giống như: <button type="submit" id="copy_button" data-clipboard-target='copyText'>Copy</button> Tập lệnh của bạn sẽ giống như:

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

</script>

Đối với tệp CDN

lưu ý : ZeroClipboard.swfZeroClipboard.js"tệp phải nằm trong cùng thư mục với tệp của bạn sử dụng chức năng này, HOẶC bạn phải đưa vào như chúng tôi đưa <script src=""></script>vào các trang của chúng tôi.


6
Flash đang đi theo con đường của Geocities.
một lập trình viên

2

Hầu hết các câu trả lời được đề xuất tạo ra một (các) yếu tố đầu vào ẩn tạm thời bổ sung. Bởi vì hầu hết các trình duyệt hiện nay đều hỗ trợ chỉnh sửa nội dung div, tôi đề xuất một giải pháp không tạo (các) phần tử ẩn, bảo toàn định dạng văn bản và sử dụng thư viện JavaScript hoặc jQuery thuần túy.

Đây là một triển khai bộ xương tối giản bằng cách sử dụng ít dòng mã nhất mà tôi có thể nghĩ ra:

//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

Thư viện Clipboard-polyfill là một polyfill cho API clipboard không đồng bộ dựa trên Promise hiện đại.

cài đặt trong CLI:

npm install clipboard-polyfill 

nhập dưới dạng clipboard trong tệp JS

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

thí dụ

Tôi đang sử dụng nó trong một gói với require("babel-polyfill");và thử nghiệm nó trên chrome 67. Tất cả đều tốt cho sản xuất.


1

mã html ở đây

    <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" />

MÃ SỐ:

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

thay đổi điều này: .value thành .innerHTML
Omar N Shamali

1

bạn có thể sao chép một văn bản riêng lẻ ngoài văn bản của phần tử 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 thuần túy, không có onclick nội tuyến, cho các lớp được ghép nối "nội dung - nút sao chép". Sẽ thoải mái hơn, nếu bạn có nhiều yếu tố)

(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>

Hỗ trợ trình duyệt cũ hơn:


-1

Cả hai sẽ hoạt động như một bùa mê :),

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

Cũng trong 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

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.