คลิกปุ่มคัดลอกไปยังคลิปบอร์ดโดยใช้ 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/…
Paul Schreiber

อ้างถึงสิ่งนี้stackoverflow.com/questions/22581345/…ได้รับโซลูชันที่คาดหวังโดยใช้ Pure JavaScript
Vignesh Chinnaiyan

@MichaelScheper - ผู้ใช้บางคนฉลาดพอที่จะสังเกตเห็นว่าความคิดเห็นของฉันและคำตอบส่วนใหญ่ที่นี่ถูกโพสต์เมื่อสี่ปีที่แล้วเมื่อ zeroclipboard ซึ่งใช้แอพแฟลชขนาดเล็กเป็นตัวเลือกที่ทำงานข้ามเบราว์เซอร์เท่านั้น ทำงานกับคลิปบอร์ดและโซลูชัน goto ทุกวันนี้เบราว์เซอร์ที่ทันสมัยรองรับสิ่งนี้เองดังนั้นจึงไม่มีปัญหาอีกต่อไป แต่นั่นไม่ใช่ในปี 2014
adeneo

@adeneo: แน่นอน แต่ไม่ใช่ผู้ใช้ทั้งหมดที่ 'ฉลาด' และความคิดเห็นของคุณยังมีสอง upvotes
Michael Scheper

คำตอบ:


483

แก้ไข ณ ปี 2559

ในปี 2559 คุณสามารถคัดลอกข้อความไปยังคลิปบอร์ดในเบราว์เซอร์ส่วนใหญ่ได้เนื่องจากเบราว์เซอร์ส่วนใหญ่มีความสามารถในการคัดลอกข้อความที่เลือกไปยังคลิปบอร์ดโดยใช้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 ได้รับ upvotes คำถามมากมายและไม่มีคำตอบสำหรับการแก้ปัญหา (อาจเป็นเพราะไม่มีอยู่):


Internet Explorer และ Firefox เคยมี API ที่ไม่ได้มาตรฐานสำหรับการเข้าถึงคลิปบอร์ด แต่เวอร์ชันที่ทันสมัยกว่านั้นได้เลิกใช้วิธีการเหล่านั้น (อาจเป็นเพราะเหตุผลด้านความปลอดภัย)


มีความพยายามในการกำหนดมาตรฐานแบบใหม่ในการพยายามหาวิธี "ปลอดภัย" เพื่อแก้ปัญหาคลิปบอร์ดที่พบบ่อยที่สุด (อาจต้องมีการดำเนินการของผู้ใช้เฉพาะเช่นโซลูชัน Flash ที่ต้องการ) และดูเหมือนว่าอาจมีการนำไปใช้บางส่วนในล่าสุด เวอร์ชั่นของ Firefox และ Chrome แต่ฉันยังไม่ได้ยืนยัน


1
clipboard.js เพิ่งถูกเพิ่มในโพสต์ที่แก้ไขนี้ มันเป็นยูทิลิตี้ที่ดีที่ผมรวมเป็นคำตอบสำหรับคำถามนี้ในเดือนสิงหาคมปี 2015
coder

1
@acoder - การสนับสนุนคลิปบอร์ดมีการเปลี่ยนแปลงเป็นประจำ ตัวอย่างเช่น Firefox เพิ่งเปิดใช้งานเมื่อเร็ว ๆ นี้ (ปลายปี 2015) document.execCommand("copy")ในสถานการณ์ที่เพียงพอที่จะใช้มันในกรณีนี้ ดังนั้นฉันจึงพยายามรักษาคำตอบให้ทันสมัยอยู่เสมอ (ซึ่งเขียนขึ้นเมื่อเกือบ 2 ปีที่แล้ว) เรายังไม่มีวิธีแก้ปัญหาที่เชื่อถือได้สำหรับ Safari นอกเหนือจากการเลือกข้อความล่วงหน้าและบอกให้ผู้ใช้กด Ctrl + C ด้วยตนเอง แต่อย่างน้อยก็มีความคืบหน้าอย่างอื่น
jfriend00

1
นี่คือลิงค์สำหรับการสนับสนุน API ของคลิปบอร์ด: caniuse.com/#feat=clipboard
L84

2
FYI ตามบันทึกย่อประจำรุ่น Safariนี้ปรากฏว่าขณะนี้ Safari 10 สนับสนุนแล้วdocument.execCommand("copy")ดังนั้นจึงควรใช้รหัสนี้ใน Safari 10 ในขณะนี้
jfriend00

1
@sebastiangodelet - โดเมนสาธารณะ
jfriend00

641

ปรับปรุง 2020 : execCommandการแก้ปัญหานี้ใช้ ในขณะที่คุณลักษณะที่ถูกปรับในช่วงเวลาของการเขียนคำตอบนี้ก็ถือว่าขณะนี้ล้าสมัย มันจะยังคงใช้งานได้กับเบราว์เซอร์จำนวนมาก แต่การใช้งานไม่ได้รับการสนับสนุนเนื่องจากอาจมีการสนับสนุน

มีวิธีอื่นที่ไม่ใช่แฟลช (นอกเหนือจากคลิปบอร์ด API ที่กล่าวถึงในคำตอบของ jfriend00 ) คุณต้องเลือกข้อความแล้วดำเนินการคำสั่ง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" />

ปัญหาหลักคือเบราว์เซอร์บางรุ่นไม่สนับสนุนคุณสมบัตินี้ในขณะนี้ แต่คุณสามารถใช้กับเบราว์เซอร์หลักได้จาก:

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

โปรดสังเกตว่าเราส่งรหัสโดยไม่มี # ตอนนี้

ดังที่madzohanรายงานในความคิดเห็นด้านล่างมีปัญหาบางอย่างกับ Google Chrome รุ่น 64 บิตในบางกรณี (เรียกใช้ไฟล์ในเครื่อง) ดูเหมือนว่าปัญหานี้จะได้รับการแก้ไขด้วยวิธีการที่ไม่ใช่ 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

2
@madzohan โอเคฉันสามารถทำซ้ำปัญหาได้ มันแปลกเพราะฉันสามารถทำซ้ำบนโลคัลเท่านั้น (ไฟล์: //) บน Chrome 64 บิต ฉันยังพบวิธีแก้ปัญหาด่วนที่เหมาะกับฉันด้วยการใช้ JavaScript ธรรมดาแทน jQuery ฉันจะอัปเดตคำตอบด้วยรหัสนั้น โปรดตรวจสอบและแจ้งให้เราทราบว่าเหมาะกับคุณหรือไม่
Alvaro Montoro

1
FWIW - document.execCommand ("copy") จะส่งคืนบูลีน (IE, Chrome, Safari) ที่ระบุว่าการคัดลอกนั้นสำเร็จหรือไม่ มันสามารถใช้เพื่อแสดงข้อความแสดงข้อผิดพลาดเมื่อล้มเหลว Firefox ส่งข้อยกเว้นเกี่ยวกับความล้มเหลว (อย่างน้อย v39) จำเป็นต้องมีการลอง / จับเพื่อจัดการข้อผิดพลาด
PointZeroTwo

3
สิ่งนี้ไม่ได้ผลสำหรับฉันจนกว่าฉันจะแน่ใจว่าสามารถมองเห็น aux บนหน้าได้โดยเพิ่มบรรทัดต่อไปนี้: aux.style.position = "fixed"; aux.style.top = 0;เหนือการappendChildโทร
ariscris

7
การปรับใช้ jQuery ดั้งเดิมล้มเหลวในการรักษาตัวแบ่งบรรทัดเนื่องจากใช้องค์ประกอบ INPUT การใช้ TEXTAREA จะแก้ปัญหานี้แทน
thomasfuchs

37

clipboard.jsเป็นยูทิลิตี้ที่ดีที่อนุญาตให้คัดลอกข้อความหรือข้อมูล HTML ไปยังคลิปบอร์ดโดยไม่ต้องใช้ 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เช่นกัน

แก้ไขเมื่อวันที่ 15 มกราคม 2016: คำตอบยอดนิยมถูกแก้ไขในวันนี้เพื่ออ้างอิง API เดียวกันในคำตอบของฉันโพสต์ในเดือนสิงหาคม 2015 ข้อความก่อนหน้านี้บอกให้ผู้ใช้ใช้ ZeroClipboard แค่ต้องการให้ชัดเจนว่าฉันไม่ได้ดึงมันออกมาจากคำตอบของ jfriend00 แต่เป็นวิธีอื่น


clipboard-js - เลิกใช้แล้วข้อความของผู้แต่ง: โปรดย้ายไปที่github.com/lgarron/clipboard-polyfill
Yevgeniy Afanasyev

26

ความเรียบง่ายคือความซับซ้อนขั้นสูงสุด
หากคุณไม่ต้องการให้ text-be-coppied ปรากฏให้เห็น:

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

มันใช้งานได้สำหรับฉัน แต่ถ้าข้อความที่จะคัดลอกมีการขึ้นบรรทัดใหม่คุณก็สามารถใช้ textarea แทนได้เช่นกัน
อเล็กซ์

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

วิธีการที่ดียิ่งขึ้นโดยไม่ใช้แฟลชหรือข้อกำหนดอื่น ๆ ใด ๆ ที่เป็นclipboard.js สิ่งที่คุณต้องทำคือเพิ่มdata-clipboard-target="#toCopyElement"ปุ่มใด ๆ เริ่มต้นมันnew Clipboard('.btn');และมันจะคัดลอกเนื้อหาของ DOM ด้วยรหัสtoCopyElementไปยังคลิปบอร์ด นี่คือตัวอย่างข้อมูลที่คัดลอกข้อความที่ให้ไว้ในคำถามของคุณผ่านลิงก์

ข้อ จำกัด อย่างหนึ่งคือว่ามันไม่ได้ทำงานบนซาฟารี แต่ทำงานบนเบราว์เซอร์อื่น ๆ ทั้งหมดรวมถึงเบราว์เซอร์มือถือเนื่องจากไม่ได้ใช้แฟลช

$(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 และ 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();
}

วิธีแก้ปัญหาที่ดี อาจเพิ่ม.addClass("hidden")ใน<input>แท็กเพื่อไม่ให้ปรากฏในเบราว์เซอร์ใช่หรือไม่
Roland

5

display: noneมันเป็นสิ่งสำคัญมากที่ช่องใส่ไม่ได้ เบราว์เซอร์จะไม่เลือกข้อความดังนั้นจึงจะไม่ถูกคัดลอก ใช้opacity: 0กับความกว้าง 0px เพื่อแก้ไขปัญหา


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 หรือเฟรมเวิร์คป่องใด ๆ

นั่นเป็นเหตุผลที่คลิปบอร์ด.

หรือ

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.swfและZeroClipboard.js"ไฟล์ควรอยู่ในโฟลเดอร์เดียวกับไฟล์ของคุณที่ใช้ฟังก์ชันนี้หรือคุณต้องรวมไฟล์ที่เรารวม<script src=""></script>ไว้ในหน้าของเรา


6
Flash กำลังไปในทิศทางของ Geocities
coder

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เป็น polyfill สำหรับ API คลิปบอร์ด API แบบอะซิงโครนัสที่ทันสมัย

ติดตั้งใน CLI:

npm install clipboard-polyfill 

นำเข้าเป็นคลิปบอร์ดในไฟล์ JS

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

ตัวอย่าง

ฉันใช้มันในชุดrequire("babel-polyfill");และทดสอบบน 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 to .innerHTML
Omar N Shamali

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

Pure JS โดยไม่มี inline คลิกสำหรับคลาส "เนื้อหา - ปุ่มคัดลอก" ที่จับคู่ จะสะดวกสบายกว่านี้ถ้าคุณมีหลายองค์ประกอบ)

(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

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.