📋 Урок 8: Поділитись деталями
📤 Хочеш скинути другу деталі таксі?
"Їду на білому Peugeot, номер АА 1234 ВВ" — кнопка 📋 Скопіювати і готово!
Clipboard API — копіює текст без Ctrl+C!
async/await — сучасний синтаксис для Promise
Сьогодні вчимось копіювати в буфер обміну! 📋
📋 Clipboard API використовують понад 95% сайтів з кнопкою "Скопіювати"
🔐 Працює тільки на HTTPS (localhost — виняток)
⚡ Замінив старий document.execCommand('copy')
Водій: Олександр ⭐ 4.9
Авто: Білий Peugeot 308
Номер: АА 1234 ВВ
Прибуде: 3 хвилини
👆 Натисни "Скопіювати" і встав куди завгодно (Ctrl+V)!
Що таке Clipboard API?
Clipboard API — вбудований інструмент браузера для роботи з буфером обміну (copy/paste).
✨ Два основні методи:
writeText()— записати текст в буфер (копіювання)readText()— прочитати текст з буфера (вставка)
writeText() — записуєш текст у блокнот (Ctrl+C).
readText() — читаєш що там записано (Ctrl+V).
Clipboard API дає JavaScript доступ до цього блокноту!
navigator.clipboard.writeText(текст) — це команда секретарю: "Запиши це!"
Текст зберігається в буфері обміну — тепер його можна вставити куди завгодно через Ctrl+V!
1. async function copyToClipboard(text) { ... }
•
async — ключове слово що робить функцію "асинхронною"•
function — оголошуємо функцію•
copyToClipboard — назва функції (що робить? копіює в буфер)•
(text) — параметр: який текст копіювати2. try { ... } catch (err) { ... }
•
try — "спробуй виконати цей код"•
catch (err) — "якщо помилка — зроби це" (err — об'єкт помилки)• Це як план Б: якщо не вийшло — не падаємо, а обробляємо
3. await navigator.clipboard.writeText(text)
•
navigator — об'єкт браузера (доступ до функцій пристрою)•
.clipboard — буфер обміну (куди йде Ctrl+C/Ctrl+V)•
.writeText(text) — "запиши текст в буфер"•
await — "зачекай поки закінчиться" (бо це Promise)4. console.log('✅ Скопійовано!')
•
console.log() — вивести повідомлення в консоль (F12 в браузері)• Виконується ТІЛЬКИ якщо копіювання успішне
5. catch (err) { console.log('❌ Помилка:', err) }
•
err — об'єкт помилки з описом що пішло не так• Виконується якщо копіювання НЕ вдалося
⚠️ КОЛИ МОЖЕ БУТИ ПОМИЛКА:
• Сторінка не на HTTPS (localhost — виняток для розробки)
• Користувач заборонив доступ до clipboard
• Браузер дуже старий і не підтримує Clipboard API
• Вкладка не активна (в фоновому режимі)
Promise (.then) — "Замовив каву, піду погуляю, а коли буде готова — мені зателефонують".
async/await — "Замовив каву, чекаю тут поки не принесуть, а потім йду далі".
Обидва варіанти працюють, але
await — читабельніший код!
СПОСІБ 1: Promise з .then()
navigator.clipboard.writeText('Текст')
• Викликаємо метод копіювання
• Повертає Promise (обіцянку що колись буде результат)
.then(function() { ... })
•
.then() — "коли Promise виконається — зроби це"•
function() { ... } — callback (що робити після успіху).catch(function(err) { ... })
•
.catch() — "якщо помилка — зроби це"• Обробка помилок через ланцюжок
СПОСІБ 2: async/await (РЕКОМЕНДОВАНО!)
async function copy() { ... }
•
async — "ця функція працює з Promise"• Дозволяє використовувати
await всерединіawait navigator.clipboard.writeText('Текст')
•
await — "зачекай результат тут" (не йди далі)• Код читається зверху вниз — як звичайний код!
try { ... } catch (err) { ... }
•
try — блок для небезпечного коду•
catch — ловимо помилку якщо щось пішло не так💡 ЧОМУ async/await КРАЩЕ:
• Код виглядає як звичайний (синхронний)
• Легше читати — йде зверху вниз
• Немає "пірамід" з callback-ів
•
await можна використовувати ТІЛЬКИ в async функції!⚠️ ВАЖЛИВО:
• Clipboard API потребує HTTPS (або localhost)
• Деякі браузери питають дозвіл у користувача
Так само після копіювання — покажи користувачу "✅ Скопійовано!"
Це UX (User Experience) — користувач має знати що дія виконалась успішно!
1. const copyBtn = document.getElementById('copyDetails')
•
const — створюємо константу (не змінну)•
document.getElementById() — знайди елемент по id•
'copyDetails' — id кнопки в HTML• Тепер
copyBtn — це наша кнопка!2. const copyStatus = document.getElementById('copyStatus')
• Так само знаходимо елемент для показу статусу
• Сюди будемо писати "Скопійовано" або "Помилка"
3. copyBtn.addEventListener('click', async function() {...})
•
copyBtn — наша кнопка•
.addEventListener() — "слухай подію"•
'click' — яку подію? клік•
async function() — асинхронна функція (бо буде await)4. const details = `...`
•
const — створюємо константу•
` ` — шаблонний рядок (можна писати в кілька рядків)• Зберігаємо текст який будемо копіювати
5. await navigator.clipboard.writeText(details)
•
await — чекаємо результат•
navigator.clipboard — буфер обміну•
.writeText(details) — записуємо текст details6. copyStatus.textContent = '✅ Скопійовано!'
•
copyStatus — елемент для статусу•
.textContent — текстовий вміст елемента•
= '...' — змінюємо текст на "Скопійовано!"7. setTimeout(function() {...}, 2000)
•
setTimeout() — "виконай через N мілісекунд"•
2000 — 2000 мс = 2 секунди•
function() { copyStatus.textContent = '' } — очищаємо текст• Результат: через 2 секунди повідомлення зникає!
✨ UX ПОРАДИ (User Experience):
• Завжди показуй статус — користувач має знати що сталось
• Автоматично прибирай повідомлення через 2-3 секунди
• Можна замість тексту змінювати саму кнопку (з "Копіювати" на "Скопійовано")
🏆 Що ти вивчив:
Де використовують Clipboard API?
✅ Коли все працює:
Натисни "Готово" в редакторі!
⏱️ ~15 хв • Урок 8 з 9
Потрібна допомога?
Напиши код і натисни Run ▶
