การตัดและวางข้อความเป็นหนึ่งในฟีเจอร์ที่ใช้กันมากที่สุดของแอปโดยทั่วไปและแอปพลิเคชันบนเดสก์ท็อปโดยเฉพาะ ฉันจะคัดลอกข้อความบนเว็บได้อย่างไร มีวิธีเก่าและวิธีใหม่ และขึ้นอยู่กับเบราว์เซอร์ที่ใช้
วิธีที่ทันสมัย
การใช้ Async Clipboard API
เมธอด Clipboard.writeText() รับสตริงและแสดงผล Promise ที่จะทำงานเมื่อเขียนข้อความลงในคลิปบอร์ดได้สำเร็จ Clipboard.writeText() ใช้ได้จากออบเจ็กต์ window ที่มีโฟกัสเท่านั้น
วิธีแบบคลาสสิก
การใช้ document.execCommand()
การเรียก document.execCommand('copy') จะแสดงผลค่าบูลีนที่ระบุว่าการคัดลอกสำเร็จหรือไม่ เรียกใช้คำสั่งนี้ภายในท่าทางผู้ใช้ เช่น ตัวแฮนเดิลการคลิก วิธีนี้มีข้อจำกัดเมื่อเทียบกับ Async Clipboard API เมธอด execCommand() ใช้ได้กับองค์ประกอบ DOM เท่านั้น เนื่องจากเป็นแบบซิงโครนัส การคัดลอกข้อมูลจำนวนมาก โดยเฉพาะข้อมูลที่ต้องมีการแปลงหรือล้างข้อมูลในบางวิธี อาจบล็อกหน้าเว็บ
การเพิ่มประสิทธิภาพแบบต่อเนื่อง
const copyButton = document.querySelector('#copyButton');
const out = document.querySelector('#out');
if ('clipboard' in navigator) {
copyButton.addEventListener('click', () => {
navigator.clipboard.writeText(out.value)
.then(() => {
console.log('Text copied');
})
.catch((err) => console.error(err.name, err.message));
});
} else {
copyButton.addEventListener('click', () => {
const textArea = document.createElement('textarea');
textArea.value = out.value;
textArea.style.opacity = 0;
document.body.appendChild(textArea);
textArea.focus();
textArea.select();
try {
const success = document.execCommand('copy');
console.log(`Text copy was ${success ? 'successful' : 'unsuccessful'}.`);
} catch (err) {
console.error(err.name, err.message);
}
document.body.removeChild(textArea);
});
}
อ่านเพิ่มเติม
- เลิกบล็อกการเข้าถึงคลิปบอร์ด (วิธีที่ทันสมัย)
- คำสั่งตัดและคัดลอก (วิธีแบบคลาสสิก)
สาธิต
HTML
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<link
rel="icon"
href="data:image/svg+xml,<svg xmlns=%22http://www.w3.org/2000/svg%22 viewBox=%220 0 100 100%22><text y=%22.9em%22 font-size=%2290%22>🎉</text></svg>"
/>
<title>How to copy text</title>
</head>
<body>
<h1>How to copy text</h1>
<textarea rows="3">
Some sample text for you to copy. Feel free to edit this.</textarea
>
<button type="button">Copy</button>
</body>
</html>CSS
:root {
color-scheme: dark light;
}
html {
box-sizing: border-box;
}
*,
*:before,
*:after {
box-sizing: inherit;
}
body {
margin: 1rem;
font-family: system-ui, sans-serif;
}
button {
display: block;
}
JS
const textarea = document.querySelector('textarea');
const button = document.querySelector('button');
button.addEventListener('click', async () => {
try {
await navigator.clipboard.writeText(textarea.value);
} catch (err) {
console.error(err.name, err.message);
}
});