คัดลอกไปยังคลิปบอร์ดโดยไม่ใช้แฟลช


90

ฉันพบวิธีแก้ปัญหามากมายสำหรับการคัดลอกไปยังคลิปบอร์ด แต่ทั้งหมดนี้ใช้แฟลชหรือสำหรับเว็บไซต์ ฉันกำลังมองหาวิธีคัดลอกไปยังคลิปบอร์ดโดยอัตโนมัติโดยไม่ต้องใช้แฟลชและสำหรับฝั่งผู้ใช้สำหรับ userscripts และแน่นอนว่าข้ามเบราว์เซอร์


ไม่พบใด ๆ กำลังมองหาสิ่งเดียวกัน ไม่ต้องการใช้ Flash ด้วยเหตุนี้จึงลบคุณลักษณะนี้ก่อนสร้าง
eugeneK


1
โดยไม่ต้องใช้ FLASH ฉันสงสัยว่าคุณสามารถทำได้ในเบราว์เซอร์ต่างๆ แต่มีวิธีแก้ปัญหาที่เป็นรูปธรรมที่สามารถช่วยคุณแก้ปัญหาzeroclipboard
Rakesh Sankar

Rakesh - "วิธีแก้ปัญหาที่เป็นรูปธรรม" ของคุณใช้ Flash มันจะไม่ทำงานในเบราว์เซอร์ใด ๆ ที่ฉันใช้
RobG

1
วิธีการ @wizztjh ในstackoverflow.com/questions/400212/…ใช้สำหรับฝั่งไซต์ไม่ใช่สำหรับฝั่งผู้ใช้ @Rakesh zeroclipboard นั้นดี แต่ฉันต้องการหาวิธีที่สมบูรณ์โดยไม่ใช้ Flash
Black_Sun

คำตอบ:


31

หากไม่มีแฟลชก็ไม่สามารถทำได้ในเบราว์เซอร์ส่วนใหญ่ คลิปบอร์ดของผู้ใช้เป็นทรัพยากรที่เกี่ยวข้องกับความปลอดภัยเนื่องจากอาจมีสิ่งต่างๆเช่นรหัสผ่านหรือหมายเลขบัตรเครดิต ดังนั้นเบราว์เซอร์จึงไม่อนุญาตให้เข้าถึง Javascript ได้อย่างถูกต้อง (บางตัวอนุญาตพร้อมคำเตือนที่แสดงว่าผู้ใช้ยืนยันหรือมีรหัส Javascript ที่ลงนามแล้ว แต่ไม่มีสิ่งใดที่เป็นข้ามเบราว์เซอร์)


21
ดังนั้นอาจจะไม่ควรอ่านหน้าเว็บจากคลิปบอร์ด แต่ทำไมไม่เขียนลงไปล่ะ = /
Ajedi32

5
แต่เหตุใดจึงปล่อยให้เกิดขึ้นผ่านแฟลชที่ซ่อนอยู่ซึ่งเกี่ยวข้องกับการแจ้งเตือนและข้อเสนอแนะของผู้ใช้เป็นศูนย์?
Eric Grange

3
@EricGrange: เนื่องจากย้อนกลับไปในช่วงกลางปี ​​1990 มีคนที่ Netscape ตัดสินใจว่าด้วยเหตุผลด้านประสิทธิภาพปลั๊กอินของเบราว์เซอร์จะเป็นไบนารีดั้งเดิมและสามารถทำอะไรได้หลายอย่าง โลกออนไลน์เป็นสถานที่ที่เรียบง่ายในสมัยนั้นและความปลอดภัยก็ไม่ได้เป็นเรื่องน่ากังวลมากนัก
Michael Borgwardt

4
ในขณะที่คำตอบนี้เป็นจริงในปี 2554 แต่เบราว์เซอร์ได้มาไกลมากในการต่อสู้เพื่อฆ่าแฟลช โปรดดูคำตอบของฉันด้านล่าง
Hovis Biddle

25

ฉันได้ลองใช้โซลูชันแฟลชแล้วและฉันก็ไม่ชอบเช่นกัน ซับซ้อนเกินไปและช้าเกินไป สิ่งที่ฉันทำคือสร้างพื้นที่ข้อความใส่ข้อมูลลงในนั้นและใช้พฤติกรรม "CTRL + C" ของเบราว์เซอร์

ส่วน jQuery javascript:

// catch the "ctrl" combination keydown
$.ctrl = function(key, callback, args) {
    $(document).keydown(function(e) {
        if(!args) args=[]; // IE barks when args is null
        if(e.keyCode == key && e.ctrlKey) {
            callback.apply(this, args);
            return false;
        }
    });
};

// put your data on the textarea and select all
var performCopy = function() {
    var textArea = $("#textArea1");
    textArea.text('PUT THE TEXT TO COPY HERE. CAN BE A FUNCTION.');
    textArea[0].focus();
    textArea[0].select();
};

// bind CTRL + C
$.ctrl('C'.charCodeAt(0), performCopy);

ส่วน HTML:
<textarea id="textArea1"></textarea>

ตอนนี้ใส่สิ่งที่คุณต้องการคัดลอกใน 'วางข้อความเพื่อคัดลอกที่นี่ สามารถเป็นหน้าที่ได้ ' พื้นที่. ใช้งานได้ดีสำหรับฉัน คุณต้องสร้างชุดค่าผสม CTRL + C ชุดเดียว ข้อเสียเปรียบเพียงประการเดียวคือคุณจะมีพื้นที่ข้อความที่น่าเกลียดปรากฏในไซต์ของคุณ หากคุณใช้ style = "display: none" โซลูชันการคัดลอกจะไม่ทำงาน


6
ดูเหมือนว่าจะผูกฟังก์ชันของ Ctrl + C กับฟังก์ชันจาวาสคริปต์เท่านั้นและไม่ได้วางข้อมูลไว้ในคลิปบอร์ดของระบบปฏิบัติการ
อิชมาเอล

แน่นอนนั่นคือความคิด ทำสำเนาเบราว์เซอร์ให้คุณ มีวิธีการแก้ปัญหาที่คล้ายกันคือที่นี่: knockoutjs.com/examples/clickCounter.html เมื่อคุณคลิกสองครั้งพวกเขาจะสร้างพื้นที่ข้อความโดยใช้จาวาสคริปต์พร้อมกับเนื้อหา
Julio Saito

ไม่ได้ผลสำหรับฉันบน osx ดังนั้นฉันจึงเพิ่มe.metaKeyในการเปรียบเทียบคีย์ดาวน์ แต่ด้วยเหตุผลบางประการการคัดลอกจะไม่ถูกทริกเกอร์ ดูซอนี้: jsfiddle.net/gableroux/gta67/1
GabLeRoux

2
@GabLeRoux ฟังก์ชันการคัดลอกในซาฟารีจะเปิดใช้งานเมื่อเลือกข้อความเท่านั้น ก่อนหน้านี้ใช้งานได้ แต่การอัปเดตซาฟารีเพิ่งหยุดลง ดูเหมือนว่าการเลือกข้อความหลังจากเหตุการณ์คีย์ดาวน์เรียกว่าไม่ได้ตัดข้อความในเบราว์เซอร์นั้นอีกต่อไป อย่างไรก็ตามยังคงใช้งานได้ดีใน Chrome โอ้ดีอาจต้องถอยกลับไปใช้แฟลชสำหรับเบราว์เซอร์นั้น ....
Aran Mulholland

แบบนี้. เมื่อคุณไม่สามารถซ่อน (ไม่ว่าด้วยเหตุผลใดก็ตาม) องค์ประกอบที่คุณไม่ต้องการเห็นคุณสามารถวางไว้ห่างจากจุดเริ่มต้นได้ตลอดเวลาเช่น padding-bottom: -1000
m3nda


10

มาถึงแล้ว! (ตราบใดที่คุณไม่รองรับ Safari หรือ IE8 ... -_-)

ตอนนี้คุณสามารถจัดการการกระทำของคลิปบอร์ดโดยไม่ใช้ Flash นี่คือเอกสารที่เกี่ยวข้อง:

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

https://developers.google.com/web/updates/2015/04/cut-and-copy-commands?hl=th

https://msdn.microsoft.com/en-us/library/hh801227%28v=vs.85%29.aspx#copy


3

ในขณะที่รออย่างใจร้อนสำหรับการสนับสนุน Xbrowser ของClipboard API ...


สิ่งนี้จะทำงานได้อย่างสวยงามใน Chrome, Firefox, Edge, IE

IEจะแจ้งให้ผู้ใช้เข้าถึงคลิปบอร์ดเพียงครั้งเดียว
ซาฟารี (5.1 ในขณะที่เขียน) ไม่รองรับexecCommandสำหรับcopy/cut

/**
 * CLIPBOARD
 * https://stackoverflow.com/a/33337109/383904
 */
const clip = e => {
  e.preventDefault();
  
  const cont = e.target.innerHTML;
  const area = document.createElement("textarea");
  
  area.value = e.target.innerHTML; // or use .textContent
  document.body.appendChild(area);
  area.select();
 
  if(document.execCommand('copy')) console.log("Copied to clipboard");
  else prompt("Copy to clipboard:\nSelect, Cmd+C, Enter", cont); // Saf, Other
  
  area.remove();
};


[...document.querySelectorAll(".clip")].forEach(el => 
  el.addEventListener("click", clip)
);
<a class="clip" href="#!">Click an item to copy</a><br>
<a class="clip" href="#!"><i>Lorem</i></a><br>
<a class="clip" href="#!"><b>IPSUM</b></a><br>

<textarea placeholder="Paste here to test"></textarea>

เบราว์เซอร์ทั้งหมด (ยกเว้น Firefox ที่จะสามารถจัดการกับชนิดของไฟล์เพียง"plain/text"เท่าที่ผมได้ทดสอบ) ได้ไม่ได้ดำเนินการคลิปบอร์ด API เช่นพยายามอ่านเหตุการณ์คลิปบอร์ดใน Chrome โดยใช้

var clipboardEvent = new ClipboardEvent("copy", {
        dataType: "plain/text",
        data: "Text to be sent to clipboard"
});

พ่น: Uncaught TypeError: ตัวสร้างที่ผิดกฎหมาย

แหล่งข้อมูลที่ดีที่สุดของความยุ่งเหยิงที่ไม่น่าเชื่อที่เกิดขึ้นในเบราว์เซอร์และคลิปบอร์ดสามารถดูได้ที่นี่ (caniuse.com) (→ติดตามความคิดเห็นใน"หมายเหตุ" )
MDN กล่าวว่าการสนับสนุนขั้นพื้นฐานคือ"(YES)"สำหรับเบราว์เซอร์ทั้งหมดที่ไม่ถูกต้องสาเหตุที่คาดว่าอย่างน้อย API จะทำงานได้ทั้งหมด


1

คุณสามารถใช้คลิปบอร์ดภายในกับเพจ HTML วิธีนี้ช่วยให้คุณสามารถคัดลอก / ตัด / วางเนื้อหาภายในหน้า HTML ได้ แต่ไม่สามารถส่งจาก / ไปยังแอปพลิเคชันของบุคคลที่สามหรือระหว่างหน้า HTML สองหน้า

นี่คือวิธีที่คุณสามารถเขียนฟังก์ชันที่กำหนดเองเพื่อทำสิ่งนี้ (ทดสอบใน chrome และ firefox):

นี่คือFIDDLEที่แสดงให้เห็นว่าคุณสามารถทำสิ่งนี้ได้อย่างไร

ฉันจะวางซอที่นี่เพื่อใช้อ้างอิง


HTML

<p id="textToCopy">This is the text to be copied</p>
<input id="inputNode" type="text" placeholder="Copied text will be pasted here" /> <br/>

<a href="#" onclick="cb.copy()">copy</a>
<a href="#" onclick="cb.cut()">cut</a>
<a href="#" onclick="cb.paste()">paste</a>

JS

function Clipboard() {
    /* Here we're hardcoding the range of the copy
    and paste. Change to achieve desire behavior. You can
    get the range for a user selection using
    window.getSelection or document.selection on Opera*/
    this.oRange = document.createRange();
    var textNode = document.getElementById("textToCopy");
    var inputNode = document.getElementById("inputNode");
    this.oRange.setStart(textNode,0);
    this.oRange.setEndAfter(textNode);
    /* --------------------------------- */
}

Clipboard.prototype.copy = function() {
    this.oFragment= this.oRange.cloneContents();
};

Clipboard.prototype.cut = function() {
    this.oFragment = this.oRange.extractContents();
};

Clipboard.prototype.paste = function() {
    var cloneFragment=this.oFragment.cloneNode(true)
    inputNode.value = cloneFragment.textContent;
};

window.cb = new Clipboard();

เฮ้ mtBrona มีวิธีที่คุณจะแนบ jsfiddle สำหรับอันนี้หรือไม่? ไม่สามารถเปิดใช้งานได้
neoswf

เราสามารถส่งสตริงตรงนี้แทน elemnt ได้ไหม
Uday A. Navapara

windowนี้ทำงานเพียงอย่างเดียวคือคุณภายในเดียวกัน มันไม่ได้เป็นคลิปบอร์ดที่เกิดขึ้นจริงสามารถใช้ได้กับระบบปฏิบัติการและเบราว์เซอร์แท็บอื่น นอกจากนี้การเลือกยังสามารถทำได้อย่างง่ายดายโดยใช้select()เพียงแค่window.getSelection()
Roko C.Buljan

0

document.execCommand('copy')จะทำในสิ่งที่คุณต้องการ แต่ไม่มีตัวอย่างที่ใช้งานได้โดยตรงในเธรดนี้โดยไม่มีไม้ค้ำยันดังนั้นนี่คือ:

var textNode = document.querySelector('p').firstChild
var range = document.createRange()
var sel = window.getSelection()

range.setStart(textNode, 0)
range.setEndAfter(textNode)
sel.removeAllRanges()
sel.addRange(range)
document.execCommand('copy')

-2

ไม่มีทางไปไหนคุณต้องใช้แฟลช มีปลั๊กอิน JQuery ที่เรียกว่าjquery.copyที่ให้การคัดลอกและวางแบบข้ามเบราว์เซอร์โดยใช้ไฟล์ flash (swf) สิ่งนี้คล้ายกับวิธีการทำงานของเครื่องมือเน้นไวยากรณ์ในบล็อกของฉัน

เมื่อคุณอ้างอิงไฟล์ jquery.copy.js สิ่งที่คุณต้องทำเพื่อพุชข้อมูลลงในคลิปบอร์ดให้รันสิ่งต่อไปนี้:

$.copy("some text to copy");

ดีและง่าย;)


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