มีปลั๊กอินของบริษัทอื่นมากมายที่สามารถใช้ฟังก์ชันคัดลอกได้ แต่ถ้าเราทำเอง เราจะรู้วิธีนำไปใช้หรือไม่
บทความนี้จะแนะนำตัวเลือกการใช้งานสามตัวเลือก
การใช้ Async Clipboard API
วิธีนี้เป็นวิธีที่ง่ายที่สุดในการใช้งาน แต่ความเข้ากันได้ไม่ค่อยดีนักและมีข้อกำหนดมากมาย
โค้ดตัวอย่าง:
constpromise = navigator.clipboard.writeText(newClipText);
โปรดทราบว่าค่าที่ส่งคืนของเมธอดคือ Promise และเมื่อใช้วิธีนี้จะต้องโฟกัสหน้าเพจไม่เช่นนั้นจะรายงานข้อผิดพลาด
ใช้ Document.execCommand
แม้ว่าวิธีการนี้จะถูกยกเลิกและไม่ใช่มาตรฐานเว็บอีกต่อไป แต่ก็มีปัจจัยทางประวัติศาสตร์มากมาย และฉันเชื่อว่าเบราว์เซอร์จะสนับสนุนมันมาเป็นเวลานาน
<p id="content">123456</p> <button id="copyButton">คัดลอก</button>
เมื่อคัดลอกองค์ประกอบ DOM คุณต้องใช้ API การเลือกและ Range API เพิ่มเติม
Developer.mozilla.org/en-US/docs/…
Developer.mozilla.org/en-US/docs/…
โค้ดตัวอย่าง:
const copyButton = document.getElementById('copyButton'); const content = document.getElementById('เนื้อหา'); copyButton.addEventListener ('คลิก' ฟังก์ชั่น () { การเลือก const = window.getSelection(); ช่วง const = document.createRange(); //ตั้งค่าช่วงเนื้อหาที่เลือกselectNodeContents(content); // ล้างส่วนที่เลือกremoveAllRanges(); //เพิ่มการเลือกเนื้อหาที่เลือก addRange(range); document.execCommand('สำเนา'); })
ต้องล้างส่วนที่เลือกก่อน จากนั้นจึงเพิ่มช่วง
มีปัญหาเกี่ยวกับรายละเอียดที่นี่ หลังจากคลิกปุ่มคัดลอก เนื้อหาที่คัดลอกก็จะถูกเลือกซึ่งค่อนข้างจะกระทันหันเล็กน้อย
วิธีแก้ไขคือการเรียก selection.removeAllRanges()
หลังจากการคัดลอกเสร็จสิ้นเพื่อล้างส่วนที่เลือก
พิจารณาสถานการณ์อื่นที่ผู้ใช้เลือกส่วนของเพจก่อนที่จะคัดลอก หลังจากการคัดลอกเสร็จสิ้น นอกเหนือจากการล้างเนื้อหาสำเนาที่เลือกแล้ว คุณยังต้องกู้คืนเนื้อหาที่ผู้ใช้เลือกก่อนทำการคัดลอกอีกด้วย
รหัสการใช้งานมีดังนี้:
const copyButton = document.getElementById('copyButton'); const content = document.getElementById('เนื้อหา'); copyButton.addEventListener ('คลิก' ฟังก์ชั่น () { การเลือก const = window.getSelection(); ช่วง const = document.createRange(); //แคชเนื้อหาที่ผู้ใช้เลือก const currentRange = Selection.rangeCount === 0 ? null : Selection.getRangeAt(0); //ตั้งค่าช่วงส่วนของเอกสาร.selectNodeContents(เนื้อหา); // ล้างส่วนที่เลือกremoveAllRanges(); //ตั้งค่าส่วนของเอกสารเป็นเนื้อหาที่เลือก addRange(range); พยายาม { // คัดลอกไปยังคลิปบอร์ด document.execCommand('copy'); } จับ (ผิดพลาด) { // แจ้งว่าการคัดลอกล้มเหลว} ในที่สุด { การเลือกremoveAllRanges(); ถ้า (ช่วงปัจจุบัน) { // เรียกคืนการเลือกเนื้อหาที่ผู้ใช้เลือก addRange (currentRange); - - })
ขั้นแรกให้แคชเนื้อหาที่ผู้ใช้เลือก จากนั้นจึงกู้คืนเนื้อหาดังกล่าวหลังจากการคัดลอกเสร็จสมบูรณ์
และใช้วิธี select
ของวัตถุองค์ประกอบอินพุตเพื่อเลือกเนื้อหา ไม่จำเป็นต้องสร้างส่วนของช่วงเพื่อตั้งค่าเนื้อหาที่เลือก
โค้ดตัวอย่าง:
const copyButton = document.getElementById('copyButton'); const inputEl = document.getElementById('input'); copyButton.addEventListener ('คลิก' ฟังก์ชั่น () { การเลือก const = window.getSelection(); const ปัจจุบันช่วง = Selection.rangeCount === 0 ? null : Selection.getRangeAt(0); //เลือกเนื้อหาอินพุต inputEl.select(); //คัดลอกไปที่คลิปบอร์ดลอง { document.execCommand('สำเนา'); } จับ (ผิดพลาด) { // แจ้งว่าการคัดลอกล้มเหลว // . - - } ในที่สุด { การเลือกremoveAllRanges(); ถ้า (ช่วงปัจจุบัน) { // เรียกคืนการเลือกเนื้อหาที่ผู้ใช้เลือก addRange (currentRange); - - });
การคลิกปุ่มคัดลอกจะไม่ลบเนื้อหาที่เลือกไว้ก่อนหน้านี้
w3c.github.io/clipboard-a
... อ้างอิงโค้ดบางส่วนในลิงก์ด้านบนเป็นตัวอย่าง:
// เขียนทับสิ่งที่กำลังคัดลอกไปยังคลิปบอร์ด document.addEventListener ('คัดลอก' ฟังก์ชั่น (e) { // e.clipboardData ว่างเปล่าในตอนแรก แต่เราสามารถตั้งค่าเป็น // ข้อมูลที่เราต้องการคัดลอกไปยังคลิปบอร์ด e.clipboardData.setData('ข้อความ/ธรรมดา', 'ไข่คนตะวันตก'); // สิ่งนี้จำเป็นเพื่อป้องกันการเลือกเอกสารปัจจุบัน // กำลังเขียนลงในคลิปบอร์ด e.preventDefault(); })
คัดลอกเนื้อหาใดๆ บนหน้าเว็บและวางเนื้อหาที่ส่งออกจะเป็น "ไข่กวนแบบตะวันตก"