เบราว์เซอร์สมัยใหม่หลายรายการรองรับการคัดลอกรูปภาพไปยังคลิปบอร์ดในรูปแบบ PNG และ SVG แต่ยังไม่รองรับรูปแบบอื่นๆ ด้วยเหตุผลด้านความปลอดภัย
วิธีสมัยใหม่
การใช้ Async Clipboard API
เมธอด Clipboard.write() รับอาร์เรย์ของออบเจ็กต์ ClipboardItem และแสดงผล Promise ที่จะทำงานเมื่อเขียนรูปภาพลงในคลิปบอร์ดได้สำเร็จ โดยคุณจะใช้ Clipboard.write() ได้จากออบเจ็กต์ window ที่มีโฟกัสเท่านั้น
วิธีแบบคลาสสิก
การใช้ navigator.clipboard.writeText()
แม้ว่าเบราว์เซอร์บางรายการจะยังไม่รองรับ navigator.clipboard.write() สำหรับข้อมูลไบนารี แต่เบราว์เซอร์ทุกรายการรองรับ navigator.clipboard.writeText() หากต้องการคัดลอกรูปภาพ SVG คุณสามารถคัดลอกซอร์สโค้ด SVG แทนการคัดลอกรูปภาพเอง แต่สำหรับรูปภาพ PNG คุณอาจต้องพึ่งโชค
การเพิ่มประสิทธิภาพแบบต่อเนื่อง
const button = document.querySelector('button');
const img = document.querySelector('img');
button.addEventListener('click', async () => {
const responsePromise = fetch(img.src);
try {
if ('write' in navigator.clipboard) {
await navigator.clipboard.write([
new ClipboardItem({
'image/svg+xml': new Promise(async (resolve) => {
const blob = await responsePromise.then(response => response.blob());
resolve(blob);
}),
}),
]);
// Image copied as image.
} else {
const text = await responsePromise.then(response => response.text());
await navigator.clipboard.writeText(text);
// Image copied as source code.
}
} catch (err) {
console.error(err.name, err.message);
}
});
อ่านเพิ่มเติม
สาธิต
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 images</title>
</head>
<body>
<h1>How to copy images</h1>
<img src="assets/fugu.svg" alt="Fugu fish." width="128" height="128">
<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 button = document.querySelector('button');
const img = document.querySelector('img');
button.addEventListener('click', async () => {
const responsePromise = fetch(img.src);
try {
if ('write' in navigator.clipboard) {
await navigator.clipboard.write([
new ClipboardItem({
'image/svg+xml': new Promise(async (resolve) => {
const blob = await responsePromise.then(response => response.blob());
resolve(blob);
}),
}),
]);
// Image copied as image.
} else {
const text = await responsePromise.then(response => response.text());
await navigator.clipboard.writeText(text);
// Image copied as source code.
}
} catch (err) {
console.error(err.name, err.message);
}
});