navigator. clipboard
Asynchroniczny dostęp do schowka systemowego. Metoda writeText() kopiuje tekst, a readText() odczytuje go ze schowka.
- Zwraca
- Obietnicę. Dla
writeText()iwrite()spełnia się wartościąundefined, dlareadText()napisem ze schowka, a dlaread()tablicą obiektówClipboardItem.
Przykład
#const copyButton = document.querySelector('#copy')
const snippet = document.querySelector('#snippet')
copyButton.addEventListener('click', async () => {
try {
await navigator.clipboard.writeText(snippet.textContent)
copyButton.textContent = 'Skopiowano!'
console.log('Skopiowano:', snippet.textContent)
} catch (error) {
console.log('Nie udało się skopiować:', error.name)
}
})Skopiowano: console.log('Witaj w CodeWorlds!')Przeglądarka blokuje schowek w izolowanej ramce, w której działają przykłady na tej stronie, dlatego kod nie uruchamia się w podglądzie. Na zwykłej stronie z blokiem kodu #snippet kliknięcie przycisku kopiuje jego treść, a konsola pokazuje wynik powyżej.
Definicja i zastosowanie
#navigator.clipboard to obiekt do pracy ze schowkiem systemowym. Najczęściej używasz metody writeText(tekst), która kopiuje napis do schowka, np. po kliknięciu przycisku „Kopiuj kod”. Metoda readText() odczytuje tekst ze schowka, a write() i read() obsługują też inne dane, np. obrazy, zapakowane w obiekty ClipboardItem.
Wszystkie metody są asynchroniczne i zwracają obietnice, więc używaj ich z await albo then(). Obietnica zostanie odrzucona, gdy przeglądarka nie pozwoli na operację, dlatego zawsze obsługuj błędy, np. blokiem try...catch.
Schowek działa tylko na stronach otwartych przez HTTPS (albo z adresu localhost), a przeglądarki chronią go przed nadużyciami. Zapis wymaga, żeby strona była aktywna, a w części przeglądarek także żeby kod działał w reakcji na działanie użytkownika, np. kliknięcie. Odczyt jest chroniony mocniej: przeglądarka może zapytać o zgodę albo pokazać przycisk „Wklej”. W ramkach iframe na dostęp musi dodatkowo zezwolić strona nadrzędna.
Metoda writeText() działa we wszystkich głównych przeglądarkach od lat. readText(), read(), write() i obiekty ClipboardItem są dostępne wszędzie dopiero od 2024 roku, dlatego przed ich użyciem warto sprawdzić, czy istnieją.
Składnia
#navigator.clipboard.writeText(text)
navigator.clipboard.readText()
navigator.clipboard.write(items)
navigator.clipboard.read()Parametry
#text
napis
Tekst do skopiowania wwriteText().items
tablica ClipboardItem
Dane do zapisania wwrite(), np. obraz albo tekst w kilku formatach.
Więcej przykładów
#document.querySelector('#paste').addEventListener('click', async () => {
try {
const text = await navigator.clipboard.readText()
document.querySelector('#project-link').value = text.trim()
console.log('Wklejono:', text.trim())
} catch (error) {
console.log('Brak dostępu do schowka:', error.name)
}
})Wklejono: https://github.com/ania/kalkulator
Przy odczycie przeglądarka może zapytać o zgodę albo pokazać przycisk „Wklej”. Gdy użytkownik odmówi, obietnica zostanie odrzucona błędem NotAllowedError i zadziała blok catch.
async function copyText(text) {
if (!navigator.clipboard) return 'Schowek niedostępny, skopiuj tekst ręcznie'
try {
await navigator.clipboard.writeText(text)
return 'Skopiowano do schowka'
} catch (error) {
return `Brak zgody na zapis: ${error.name}`
}
}
document.querySelector('#coupon').addEventListener('click', async () => {
console.log(await copyText('KURS-20'))
})Skopiowano do schowka
Wynik pojawia się po kliknięciu przycisku na stronie otwartej przez HTTPS. Na stronie otwartej przez zwykłe HTTP obiekt navigator.clipboard nie istnieje i funkcja zwraca pierwszy komunikat.
Obsługa przeglądarek
#Nowość w przeglądarkach · od 2024 roku
Działa w aktualnych wersjach wszystkich głównych przeglądarek. Starsze wersje mogą tego nie obsługiwać.
- Chrome
- Edge
- Firefox
- Safari
Dobre praktyki
#- Wywołuj
writeText()w obsłudze kliknięcia. Kopiowanie bez działania użytkownika część przeglądarek zablokuje. - Zawsze obsłuż odrzuconą obietnicę i daj znać, czy kopiowanie się udało, np. zmieniając napis na przycisku na „Skopiowano!”.
- Na stronach bez HTTPS
navigator.clipboardnie istnieje. Sprawdź go przed użyciem, np. przeznavigator.clipboard?.writeText.
Powiązane hasła
#- EventTarget.addEventListener()Rejestruje funkcję wywoływaną za każdym razem, gdy na elemencie wystąpi zdarzenie, np. kliknięcie.
- async functionDeklaruje funkcję asynchroniczną, która zawsze zwraca obietnicę i może używać w środku słowa await.
- awaitWstrzymuje funkcję async do czasu rozstrzygnięcia obietnicy i zwraca jej wartość albo rzuca jej błąd.
- try...catchPrzechwytuje błędy rzucone w bloku try i obsługuje je w catch. Opcjonalny finally wykona się zawsze.
- PromiseObiekt reprezentujący wynik operacji, który pojawi się w przyszłości: wartość przy sukcesie albo błąd.
Widzisz błąd albo brakuje przykładu? Napisz do nas.