0
Koodi Прогрес
Поточний:0 днів
Рекорд:0 днів
Без активності
Активний день
Сьогодні
🆓 FREE PROJECT

📋 Урок 8: Поділитись деталями

📤 Хочеш скинути другу деталі таксі?

"Їду на білому Peugeot, номер АА 1234 ВВ" — кнопка 📋 Скопіювати і готово!

Clipboard API — копіює текст без Ctrl+C!

async/await — сучасний синтаксис для Promise

Сьогодні вчимось копіювати в буфер обміну! 📋

💡
А ТИ ЗНАВ?

📋 Clipboard API використовують понад 95% сайтів з кнопкою "Скопіювати"
🔐 Працює тільки на HTTPS (localhost — виняток)
⚡ Замінив старий document.execCommand('copy')

😂 Жарт для розігріву!
Чому програміст не любив Ctrl+C?
Бо він використовував navigator.clipboard.writeText() як справжній професіонал! 📋✨
📱 ЖИВИЙ ДОДАТОК
Спробуй скопіювати!
9:41 🔋 100%
📋 ДЕТАЛІ ПОЇЗДКИ

Водій: Олександр ⭐ 4.9

Авто: Білий Peugeot 308

Номер: АА 1234 ВВ

Прибуде: 3 хвилини

👆 Натисни "Скопіювати" і встав куди завгодно (Ctrl+V)!

📋

Що таке Clipboard API?

Clipboard API — вбудований інструмент браузера для роботи з буфером обміну (copy/paste).

✨ Два основні методи:

  • writeText() — записати текст в буфер (копіювання)
  • readText() — прочитати текст з буфера (вставка)
Clipboard ⚡ async/await 🔐 HTTPS
📝
Clipboard — це невидимий блокнот
Уяви: у тебе є невидимий блокнот, який завжди під рукою.

writeText() — записуєш текст у блокнот (Ctrl+C).
readText() — читаєш що там записано (Ctrl+V).

Clipboard API дає JavaScript доступ до цього блокноту!
🔄
Як працює копіювання?
Натисни кнопку щоб побачити процес
📝
Текст
writeText()
📋
Буфер
Готово!
⚔️
Старий vs Новий спосіб
Чому Clipboard API краще?
👴
execCommand('copy')
Застарілий, синхронний, потребує textarea
🚀
clipboard.writeText()
Сучасний, async, простий у використанні
1
Копіюємо текст в буфер
📋
Уяви секретаря, який записує все що ти кажеш у блокнот.

navigator.clipboard.writeText(текст) — це команда секретарю: "Запиши це!"

Текст зберігається в буфері обміну — тепер його можна вставити куди завгодно через Ctrl+V!
Напиши цей код:
// Копіюємо текст в буфер обміну async function copyToClipboard(text) { try { await navigator.clipboard.writeText(text); console.log('✅ Скопійовано!'); } catch (err) { console.log('❌ Помилка:', err); } } // Використання: copyToClipboard('Привіт, світ!');
🔍 ДЕТАЛЬНИЙ РОЗБІР КОЖНОГО РЯДКА:

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
• Вкладка не активна (в фоновому режимі)
🧪 Тест: navigator.clipboard.writeText() повертає...
2
async/await синтаксис
Уяви що ти замовляєш каву в кав'ярні.

Promise (.then) — "Замовив каву, піду погуляю, а коли буде готова — мені зателефонують".
async/await — "Замовив каву, чекаю тут поки не принесуть, а потім йду далі".

Обидва варіанти працюють, але await — читабельніший код!
Порівняй два способи:
// Спосіб 1: Promise з .then() navigator.clipboard.writeText('Текст') .then(function() { console.log('Готово!'); }) .catch(function(err) { console.log('Помилка', err); }); // Спосіб 2: async/await (рекомендовано!) async function copy() { try { await navigator.clipboard.writeText('Текст'); console.log('Готово!'); } catch (err) { console.log('Помилка', err); } }
🔍 ДЕТАЛЬНИЙ РОЗБІР ДВОХ СПОСОБІВ:

СПОСІБ 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)
• Деякі браузери питають дозвіл у користувача
🧪 Тест: async/await це...
3
UX: показуємо що скопійовано
Уяви касу в магазині. Після оплати чек видруковується — це підтвердження.

Так само після копіювання — покажи користувачу "✅ Скопійовано!"

Це UX (User Experience) — користувач має знати що дія виконалась успішно!
Напиши цей код:
const copyBtn = document.getElementById('copyDetails'); const copyStatus = document.getElementById('copyStatus'); copyBtn.addEventListener('click', async function() { const details = `🚖 Koodi Taxi Водій: Олександр ⭐ 4.9 Авто: Білий Peugeot 308 Номер: АА 1234 ВВ`; try { await navigator.clipboard.writeText(details); copyStatus.textContent = '✅ Скопійовано!'; // Прибираємо повідомлення через 2 секунди setTimeout(function() { copyStatus.textContent = ''; }, 2000); } catch (err) { copyStatus.textContent = '❌ Помилка копіювання'; } });
🔍 ДЕТАЛЬНИЙ РОЗБІР КОЖНОГО РЯДКА:

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) — записуємо текст details

6. copyStatus.textContent = '✅ Скопійовано!'
copyStatus — елемент для статусу
.textContent — текстовий вміст елемента
= '...' — змінюємо текст на "Скопійовано!"

7. setTimeout(function() {...}, 2000)
setTimeout() — "виконай через N мілісекунд"
2000 — 2000 мс = 2 секунди
function() { copyStatus.textContent = '' } — очищаємо текст
• Результат: через 2 секунди повідомлення зникає!

✨ UX ПОРАДИ (User Experience):
• Завжди показуй статус — користувач має знати що сталось
• Автоматично прибирай повідомлення через 2-3 секунди
• Можна замість тексту змінювати саму кнопку (з "Копіювати" на "Скопійовано")
🧪 Тест: Clipboard API потребує...

🏆 Що ти вивчив:

clipboard.writeText() — копіювати текст в буфер
async/await — сучасний синтаксис для Promise
try/catch — обробляти помилки
UX feedback — показувати статус користувачу
🌍

Де використовують Clipboard API?

🚖 Uber/Bolt: "Скопіювати деталі поїздки"
💻 GitHub: "Скопіювати URL репозиторію", "Скопіювати код"
🔐 Менеджери паролів: "Скопіювати пароль"
📝 Документи: "Скопіювати посилання на документ"

✅ Коли все працює:

Натисни "Готово" в редакторі!

⏱️ ~15 хв • Урок 8 з 9

Потрібна допомога?

💡 Підказка
🤖 AI-KOODI
HTML index.html ✏️
CSS style.css
JS app.js
1 2 3 4 5 6 7 8 9 10
localhost/taxi-clipboard.html
📋

Напиши код і натисни Run ▶