clipboard-polyfill
clipboard-polyfill
! Примечание. Начиная с 2020 года вы можете использовать navigator.clipboard.writeText(...)
в стабильных версиях всех основных браузеров. Эта библиотека будет вам полезна, только если вы хотите:
text/html
в Firefox ≤126,ClipboardItem
в Firefox ≤126 илиjsdom
).Более подробную информацию см. в разделе «Совместимость» ниже.
Делает копирование в Интернете таким же простым, как:
clipboard . writeText ( "hello world" ) ;
Эта библиотека представляет собой ponyfill/polyfill для современного API асинхронного буфера обмена на основе Promise
.
Если вы используете npm
, установите:
npm install clipboard-polyfill
Пример приложения, копирующего текст в буфер обмена:
import * as clipboard from "clipboard-polyfill" ;
function handler ( ) {
clipboard . writeText ( "This text is plain." ) . then (
( ) => { console . log ( "success!" ) ; } ,
( ) => { console . log ( "error!" ) ; }
) ;
}
window . addEventListener ( "DOMContentLoaded" , function ( ) {
const button = document . body . appendChild ( document . createElement ( "button" ) ) ;
button . textContent = "Copy" ;
button . addEventListener ( "click" , handler ) ;
} ) ;
Примечания:
button
).async
/ await
import * as clipboard from "clipboard-polyfill" ;
async function handler ( ) {
console . log ( "Previous clipboard text:" , await clipboard . readText ( ) ) ;
await clipboard . writeText ( "This text is plain." ) ;
}
window . addEventListener ( "DOMContentLoaded" , function ( ) {
const button = document . body . appendChild ( document . createElement ( "button" ) ) ;
button . textContent = "Copy" ;
button . addEventListener ( "click" , handler ) ;
} ) ;
import * as clipboard from "clipboard-polyfill" ;
async function handler ( ) {
console . log ( "Previous clipboard contents:" , await clipboard . read ( ) ) ;
const item = new clipboard . ClipboardItem ( {
"text/html" : new Blob (
[ "<i>Markup</i> <b>text</b>. Paste me into a rich text editor." ] ,
{ type : "text/html" }
) ,
"text/plain" : new Blob (
[ "Fallback markup text. Paste me into a rich text editor." ] ,
{ type : "text/plain" }
) ,
} ) ;
await clipboard . write ( [ item ] ) ;
}
window . addEventListener ( "DOMContentLoaded" , function ( ) {
const button = document . body . appendChild ( document . createElement ( "button" ) ) ;
button . textContent = "Copy" ;
button . addEventListener ( "click" , handler ) ;
} ) ;
Дополнительные сведения см. в спецификации API буфера обмена.
Примечания:
async
функции для синтаксиса await
.text/plain
и text/html
— единственные типы данных, которые можно записывать в буфер обмена в большинстве браузеров.read()
может возвращать только подмножество поддерживаемых типов данных, даже если буфер обмена содержит больше типов данных. Невозможно определить, было ли больше типов данных.overwrite-globals
версию Если вы хотите, чтобы библиотека перезаписывала глобальный API буфера обмена своими реализациями, импортируйте clipboard-polyfill/overwrite-globals
. Это превратит библиотеку из понифилла в полноценный полифил, и вы сможете писать код так, как если бы API асинхронного буфера обмена уже был реализован в вашем браузере:
import "clipboard-polyfill/overwrite-globals" ;
async function handler ( ) {
const item = new window . ClipboardItem ( {
"text/html" : new Blob (
[ "<i>Markup</i> <b>text</b>. Paste me into a rich text editor." ] ,
{ type : "text/html" }
) ,
"text/plain" : new Blob (
[ "Fallback markup text. Paste me into a rich text editor." ] ,
{ type : "text/plain" }
) ,
} ) ;
navigator . clipboard . write ( [ item ] ) ;
}
window . addEventListener ( "DOMContentLoaded" , function ( ) {
const button = document . body . appendChild ( document . createElement ( "button" ) ) ;
button . textContent = "Copy" ;
button . addEventListener ( "click" , handler ) ;
} ) ;
Этот подход не рекомендуется, так как он может нарушить работу любого другого кода, который взаимодействует с глобальными переменными API буфера обмена, и может быть несовместим с будущими реализациями браузера.
Promise
Если вам нужно получить версию, которая «просто работает», загрузите clipboard-polyfill.window-var.promise.es5.js
и включите ее с помощью тега <script>
:
< script src =" ./clipboard-polyfill.window-var.promise.es5.js " > </ script >
< button onclick =" copy() " > Copy text! </ button >
< script >
// `clipboard` is defined on the global `window` object.
function copy ( ) {
clipboard . writeText ( "hello world!" ) ;
}
</ script >
Благодаря удобствам современной экосистемы JS мы больше не предоставляем древовидные, минифицированные сборки или сборки CommonJS. Чтобы получить такие сборки без потери совместимости, передайте сборки clipboard-polyfill
через esbuild
. Например:
mkdir temp && cd temp && npm install clipboard-polyfill esbuild
# Minify the ES6 build:
echo ' export * from "clipboard-polyfill"; ' | npx esbuild --format=esm --target=es6 --bundle --minify
# Include just the `writeText()` export and minify:
echo ' export { writeText } from "clipboard-polyfill"; ' | npx esbuild --format=esm --target=es6 --bundle --minify
# Minify an ES5 build:
cat node_modules/clipboard-polyfill/dist/es5/window-var/clipboard-polyfill.window-var.promise.es5.js | npx esbuild --format=esm --target=es5 --bundle --minify
# Get a CommonJS build:
echo ' export * from "clipboard-polyfill"; ' | npx esbuild --format=cjs --target=es6 --bundle
clipboard-polyfill
? Со временем в браузерах было реализовано несколько API-интерфейсов буфера обмена, и запись в буфер обмена без возникновения ошибок в различных старых и текущих браузерах довольно сложна. В каждом браузере, который каким-либо образом поддерживает копирование в буфер обмена, clipboard-polyfill
пытается действовать как можно ближе к API асинхронного буфера обмена. (См. выше отказ от ответственности и ограничения.)
В этой презентации вы найдете более подробную историю доступа к буферу обмена в Интернете.
clipboard-polyfill
.Напишите поддержку по самой ранней версии браузера:
Браузер | writeText() | write() (HTML) | write() (другие форматы) |
---|---|---|---|
Сафари 13.1 | ☑️ | ☑️ | ☑️ ( image/uri-list , image/png ) |
Хром 86 ᵃ / Край 86 | ☑️ | ☑️ | ☑️ ( image/png ) |
Хром 76ᵃ / Край 79 | ☑️ | ✅ | ☑️ ( image/png ) |
Chrome 66ᵃ / Firefox 63 | ☑️ | ✅ | |
Safari 10/Chrome 42ᵃ/Edgeᵈ/Firefox 41 | ✅ | ✅ᵇ | |
ИЕ 9 | ✅ᶜ |
Читать поддержку:
Браузер | readText() | read() (HTML) | read() (другие форматы) |
---|---|---|---|
Сафари 13.1 | ☑️ | ☑️ | ☑️ ( image/uri-list , image/png ) |
Хром 76 ᵃ / Край 79 | ☑️ | ☑️ ( image/png ) | |
Хром 66ᵃ | ☑️ | ||
ИЕ 9 | ✅ᶜ | ||
Firefox |
window.Promise
Обещайте, если хотите, чтобы библиотека работала.clipboard-polyfill
всегда будет сообщать об успехе.ClipboardItem
.text/html
не записывается с использованием ожидаемого формата CF_HTML
. clipboard-polyfill
не пытается обойти эту проблему, поскольку 1) для этого потребуется анализ хрупкой версии браузера, 2) пользователи Edge обычно не застревают на версии < 17 и 3) режимом сбоя для других браузеров будет недопустимый буфер обмена. HTML копируется. (Ошибка Edge № 14372529, № 73) clipboard-polyfill
использует различные эвристики для обхода ошибок совместимости. Сообщите нам, если у вас возникнут проблемы совместимости с каким-либо из браузеров, перечисленных выше.
Браузер | Поддержка первой версииnavigator.clipboard.writeText(...) | Дата выпуска |
---|---|---|
Хром | 66+ | апрель 2018 г. |
Firefox | 53+ | Октябрь 2018 г. |
Край | 79+ (первая версия на базе Chromium) | январь 2020 г. |
Сафари | 13.1+ | март 2020 г. |
Этот проект появился в то время, когда доступ к буферу обмена в JS был едва возможен, а работа над эргономичным API буфера обмена застопорилась. (Подробнее см. в этой презентации.) К счастью, с 2020 года эргономичный API с той же функциональностью теперь доступен во всех современных браузерах:
document.execCommand("copy")
(с множеством проблем).clipboard.js
(за полгода до того, как @zenorocha выбрал то же имя?).crbug.com/593475
).clipboard-polyfill
чтобы отразить пересмотр API v2
в соответствии с черновой спецификацией.navigator.clipboard.writeText()
.navigator.clipboard.write()
(включая поддержку text/html
).Спасибо Гэри Качмарчику, Холлворду Стину и другим за помощь в воплощении в жизнь API асинхронного буфера обмена!
Если вам нужно только скопировать текст в современных браузерах, рассмотрите возможность прямого использования navigator.clipboard.writeText()
: https://caniuse.com/mdn-api_clipboard_writetext
Если вам также нужно скопировать текст в старых браузерах, вы также можете попробовать этот вариант простого хакерского решения.