>>
Современное решение: Clipboard API
Начиная с 2020 года, лучший и рекомендуемый способ копирования текста в буфер обмена — использование Clipboard API (метод navigator.clipboard.writeText()). Это асинхронный, современный стандарт, который пришёл на смену устаревшему document.execCommand('copy').
Базовый пример для копирования из любого элемента
Если текст находится в <div>, <p> или любом другом блочном элементе, просто прочитайте его содержимое и передайте в API:
// HTML: <button onclick="copyToClipboard()">Копировать</button>
// <p id="myText">Текст, который нужно скопировать</p>
async function copyToClipboard() {
const text = document.getElementById('myText').innerText;
try {
await navigator.clipboard.writeText(text);
console.log('Текст скопирован!');
} catch (err) {
console.error('Ошибка копирования: ', err);
}
}
Копирование из поля ввода (input или textarea)
Для <input> или <textarea> можно использовать свойство .value:
// HTML: <input id="myInput" value="Текст из поля" />
// <button onclick="copyInput()">Копировать</button>
async function copyInput() {
const input = document.getElementById('myInput');
try {
await navigator.clipboard.writeText(input.value);
alert('Скопировано!');
} catch (err) {
console.error('Не удалось скопировать: ', err);
}
}
Важные моменты и обработка ошибок
Устаревший, но рабочий fallback (execCommand)
Если вам нужно поддерживать очень старые браузеры (например, Internet Explorer), используйте этот метод как запасной вариант:
function fallbackCopyText(text) {
const textarea = document.createElement('textarea');
textarea.value = text;
textarea.style.position = 'fixed'; // Не скроллить страницу
textarea.style.opacity = '0';
document.body.appendChild(textarea);
textarea.select();
document.execCommand('copy');
document.body.removeChild(textarea);
}
Полный пример с проверкой поддержки
async function copyToClipboard(text) {
if (!navigator.clipboard) {
fallbackCopyText(text);
return;
}
try {
await navigator.clipboard.writeText(text);
alert('Скопировано!');
} catch (err) {
console.error('Ошибка: ', err);
}
}
Используйте Clipboard API как основной метод — он проще, безопаснее и лучше интегрируется с современными браузерами.
<<>>
Альтернативный подход: копирование с помощью выделения и execCommand
Если вы по каким-то причинам не можете использовать Clipboard API (например, проект работает на HTTP, или нужно поддерживать IE11), можно использовать проверенный временем метод с document.execCommand('copy'). Однако помните: этот метод считается устаревшим и может быть удалён в будущих версиях браузеров.
Как это работает
- Создаётся временный элемент
<textarea> или <input>.
- В него записывается нужный текст.
- Элемент добавляется в DOM, выделяется программно (через
.select()).
- Вызывается
document.execCommand('copy').
- Временный элемент удаляется из DOM.
Пример кода
function copyTextFallback(text) {
// Создаём невидимый textarea
const textarea = document.createElement('textarea');
textarea.value = text;
textarea.style.position = 'fixed';
textarea.style.left = '-9999px'; // Прячем за экраном
document.body.appendChild(textarea);
// Выделяем и копируем
textarea.focus();
textarea.select();
try {
const successful = document.execCommand('copy');
if (successful) {
alert('Текст скопирован!');
} else {
alert('Не удалось скопировать');
}
} catch (err) {
console.error('Ошибка копирования: ', err);
}
// Убираем временный элемент
document.body.removeChild(textarea);
}
Когда использовать
- Для поддержки старых браузеров (IE11, Safari до 13.1).
- Если сайт работает по HTTP (без HTTPS).
- Как fallback при ошибке Clipboard API.
Этот метод менее элегантен, но по-прежнему работает в подавляющем большинстве случаев. Главное — не забывайте удалять временный элемент после копирования, чтобы не засорять DOM.