بسیاری از مرورگرهای مدرن از کپی کردن تصاویر در کلیپ بورد با فرمتهای PNG و SVG پشتیبانی میکنند. فرمتهای دیگر به دلایل امنیتی هنوز پشتیبانی نمیشوند.
روش مدرن
استفاده از 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);
}
});
مطالعه بیشتر
نسخه آزمایشی
اچتیامال
<!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>سیاساس
: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;
}
جیاس
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);
}
});