Реалізація Clipboard API на сайті

Наша компанія займається розробкою, підтримкою та обслуговуванням сайтів будь-якої складності. Від простих односторінкових сайтів до масштабних кластерних систем, побудованих на мікро сервісах. Досвід розробників підтверджено сертифікатами від вендорів.

Розробка та обслуговування будь-яких видів сайтів:

Інформаційні сайти або веб-програми
Сайти візитки, landing page, корпоративні сайти, онлайн каталоги, квіз, промо-сайти, блоги, ресурси новин, інформаційні портали, форуми, агрегатори
Сайти або веб-програми електронної комерції
Інтернет-магазини, B2B-портали, маркетплейси, онлайн-обмінники, кешбек-сайти, біржі, дропшиппінг-платформи, парсери товарів
Веб-програми для управління бізнес-процесами
CRM-системи, ERP-системи, корпоративні портали, системи управління виробництвом, парсери інформації
Сайти або веб-програми електронних послуг
Дошки оголошень, онлайн-школи, онлайн-кінотеатри, конструктори сайтів, портали надання електронних послуг, відеохостинги, тематичні портали

Це лише деякі з технічних типів сайтів, з якими ми працюємо, і кожен із них може мати свої специфічні особливості та функціональність, а також бути адаптованим під конкретні потреби та цілі клієнта.

Пропоновані послуги
Показано 1 з 1 послугУсі 2065 послуг
Реалізація Clipboard API на сайті
Проста
~2-3 години
Часті питання

Наші компетенції:

Етапи розробки

Останні роботи

  • image_website-b2b-advance_0.png
    Розробка сайту компанії B2B ADVANCE
    1262
  • image_web-applications_feedme_466_0.webp
    Розробка веб-додатків для компанії FEEDME
    1171
  • image_websites_belfingroup_462_0.webp
    Розробка веб-сайту для компанії БЕЛФІНГРУП
    874
  • image_ecommerce_furnoro_435_0.webp
    Розробка інтернет магазину для компанії FURNORO
    1094
  • image_crm_enviok_479_0.webp
    Розробка веб-додатків для компанії Enviok
    831
  • image_bitrix-bitrix-24-1c_fixper_448_0.png
    Розробка веб-сайту для компанії ФІКСПЕР
    851

Реалізація Clipboard API на сайті

Clipboard API — замінює застарілий document.execCommand('copy'). Асинхронний, permission-based, підтримує не тільки текст, але й зображення, HTML, користувацькі формати даних. Працює через navigator.clipboard і вимагає Secure Context.

Базове використання

Копіювання тексту — найчастіший сценарій:

async function copyToClipboard(text: string): Promise<void> {
  if (!navigator.clipboard) {
    // Fallback для HTTP-контексту або старих браузерів
    const textarea = document.createElement('textarea')
    textarea.value = text
    textarea.style.cssText = 'position:fixed;opacity:0;pointer-events:none'
    document.body.appendChild(textarea)
    textarea.select()
    document.execCommand('copy')
    document.body.removeChild(textarea)
    return
  }

  await navigator.clipboard.writeText(text)
}

async function readFromClipboard(): Promise<string> {
  return navigator.clipboard.readText()
}

Дозволи

Запис (writeText, write) не вимагає явного запиту дозволу — достатньо, що сторінка у фокусі та дія ініціюється користувачем. Читання (readText, read) запрашивает дозвіл clipboard-read через Permissions API:

async function checkClipboardPermission(): Promise<PermissionState> {
  const result = await navigator.permissions.query({
    name: 'clipboard-read' as PermissionName,
  })
  return result.state // 'granted' | 'denied' | 'prompt'
}

Робота зі зображеннями

async function copyImageToClipboard(blob: Blob): Promise<void> {
  const item = new ClipboardItem({ [blob.type]: blob })
  await navigator.clipboard.write([item])
}

async function copyCanvasToClipboard(canvas: HTMLCanvasElement): Promise<void> {
  const blob = await new Promise<Blob>((resolve, reject) =>
    canvas.toBlob((b) => (b ? resolve(b) : reject(new Error('Помилка конвертації'))), 'image/png')
  )
  await copyImageToClipboard(blob)
}

Читаємо зображення з буфера:

async function pasteImage(): Promise<HTMLImageElement | null> {
  const items = await navigator.clipboard.read()
  for (const item of items) {
    const imageType = item.types.find((t) => t.startsWith('image/'))
    if (imageType) {
      const blob = await item.getType(imageType)
      const url = URL.createObjectURL(blob)
      const img = new Image()
      img.src = url
      img.onload = () => URL.revokeObjectURL(url)
      return img
    }
  }
  return null
}

React-хук зі станом зворотного зв'язку

function useCopyToClipboard(resetDelay = 2000) {
  const [copied, setCopied] = useState(false)
  const timerRef = useRef<ReturnType<typeof setTimeout>>()

  const copy = useCallback(async (text: string) => {
    try {
      await copyToClipboard(text)
      setCopied(true)
      clearTimeout(timerRef.current)
      timerRef.current = setTimeout(() => setCopied(false), resetDelay)
    } catch {
      setCopied(false)
    }
  }, [resetDelay])

  useEffect(() => () => clearTimeout(timerRef.current), [])

  return { copy, copied }
}

// Компонент
function CopyButton({ text }: { text: string }) {
  const { copy, copied } = useCopyToClipboard()

  return (
    <button onClick={() => copy(text)}>
      {copied ? 'Скопійовано!' : 'Копіювати'}
    </button>
  )
}

Подія Paste на рівні документа

Перехоплення вставки для drag-and-drop редакторів та завантажувачів зображень:

document.addEventListener('paste', async (event: ClipboardEvent) => {
  const items = event.clipboardData?.items ?? []

  for (const item of Array.from(items)) {
    if (item.type.startsWith('image/')) {
      event.preventDefault()
      const file = item.getAsFile()
      if (file) await handleImagePaste(file)
    }
  }
})

Що входить у роботу

Реалізація утилітів копіювання/вставки з fallback, React-хук useCopyToClipboard, підтримка тексту та зображень, візуальна зворотна вязь (іконка, тост, tooltip). Опціонально — інтеграція з редактором або завантажувачем файлів.

Строк: половина дня.