navigator.clipboard — Новый асинхронный Clipboard API в JavaScript

Источник: «navigator.clipboard - The New Asynchronous Clipboard API in JavaScript»
Копирование и вставка текста, изображений и файлов с помощью нового API navigator.clipboard

Впервые столкнувшись с новым API navigator.clipboard, я был поражён тем, насколько просто он упростил копирование и вставку в веб-приложениях. Прошли времена хаков document.execCommand.

Раньше для обработки операций с буфером обмена использовался document.execCommand("copy"). Этот подход был синхронным и ограниченным — он мог копировать текст только из выбранных элементов DOM. Кроме того, в разных браузерах он работал нестабильно.

API navigator.clipboard решает эти проблемы, предоставляя асинхронные методы, работающие с различными типами данных. Кроме того, он безопаснее — браузеры требуют явного разрешения, прежде чем разрешить доступ к буферу обмена.

try {
await navigator.clipboard.writeText('Hello from clipboard!');
console.log('Text copied');
} catch (err) {
console.error('Failed to copy:', err);
}

Чтение текста работает аналогичным образом:

try {
const text = await navigator.clipboard.readText();
console.log('Pasted content:', text);
} catch (err) {
console.error('Failed to paste:', err);
}

Копирование сложных данных, например изображений или файлов:

try {
const imageBlob = new Blob(['<image data>'], {type: 'image/png'});
const item = new ClipboardItem({
'image/png': imageBlob
});
await navigator.clipboard.write([item]);
} catch (err) {
console.error('Failed to copy image:', err);
}

Рекомендации относительно поддержки браузерами

Несмотря на широкую поддержку Clipboard API, нелишним будет предусмотреть резервные варианты:

if (navigator.clipboard) {
// Использование нового Clipboard API
} else {
// Резервный вариант для старых браузеров, использование execCommand
const textArea = document.createElement('textarea');
textArea.value = text;
document.body.appendChild(textArea);
textArea.select();
try {
document.execCommand('copy');
} finally {
document.body.removeChild(textArea);
}
}

Когда использовать navigator.clipboard API

Асинхронный Clipboard API отлично работает в нескольких типичных сценариях:

Модель разрешений API может показаться лишней, но это достойный компромисс с точки зрения безопасности и надёжности. Прошли времена борьбы с выделением текста и синхронными операциями с буфером обмена.

В следующий раз, когда потребуется реализовать функциональность буфера обмена, воспользуйтесь navigator.clipboard.

Не забудьте добавить поддержку для старых браузеров, и пользователи поблагодарят вас за удобство работы.

Комментарии


Дополнительные материалы

Предыдущая Статья

CSS @supports

Следующая Статья

HTML элемент details: Встроенный аккордеон, который вы не используете