Взаимодействие с буфером обмена
Работа с буфером обмена в расширениях переходит от метода Web API document.execCommand (который устарел) к методу navigator.clipboard.
Примечание: API navigator.clipboard — недавнее дополнение к спецификации и может быть не полностью реализовано во всех браузерах. В этой статье описаны некоторые ограничения, но обязательно ознакомьтесь с таблицами совместимости для каждого метода, чтобы убедиться, что API соответствует вашим потребностям.
Разница между двумя API заключается в том, что document.execCommand аналогичен действиям копирования, вырезания и вставки с клавиатуры — обмен данными между веб-страницей и буфером обмена — в то время как navigator.clipboard записывает и считывает произвольные данные в буфер обмена и из него.
navigator.clipboard предоставляют отдельные методы для чтения или записи:
- текстового содержимого, используя
navigator.clipboard.readText()иnavigator.clipboard.writeText(). - изображений, форматированного текста, HTML и другого форматированного содержимого, используя
navigator.clipboard.read()иnavigator.clipboard.write().
Однако, в то время как navigator.clipboard.readText() и navigator.clipboard.writeText() работают во всех браузерах, navigator.clipboard.read() и navigator.clipboard.write() — нет. Например, в Firefox на момент написания navigator.clipboard.read() и navigator.clipboard.write() не полностью реализованы, так что:
- для работы с изображениями используйте
browser.clipboard.setImageData()для записи изображений в буфер обмена иdocument.execCommand("paste")для вставки изображений на веб-страницу. - для записи форматированного содержимого (такого как HTML, форматированный текст, включая изображения и т. д.) в буфер обмена, используйте
document.execCommand("copy")илиdocument.execCommand("cut"). Затем используйте либоnavigator.clipboard.read()(рекомендуется), либоdocument.execCommand("paste")для чтения содержимого из буфера обмена.
Запись в буфер обмена
В этом разделе описаны варианты записи данных в буфер обмена.
Использование API буфера обмена
API буфера обмена записывает произвольные данные в буфер обмена из вашего расширения. Для использования API необходимо разрешение "clipboardRead" или "clipboardWrite" в вашем файле manifest.json. Поскольку API доступен только в безопасных контекстах, его нельзя использовать из скрипта содержимого, работающего на страницах http:, только на страницах https:.
Для скриптов страниц разрешение "clipboard-write" необходимо запросить, используя Web API navigator.permissions. Вы можете проверить это разрешение, используя navigator.permissions.query():
navigator.permissions.query({name: "clipboard-write"}).then((result) => { if (result.state === "granted" || result.state === "prompt") { /* write to the clipboard now */ } });
Примечание: Имя разрешения clipboard-write не поддерживается в Firefox, только в браузерах Chromium.
Эта функция принимает строку и записывает её в буфер обмена:
function updateClipboard(newClip) { navigator.clipboard.writeText(newClip).then(() => { /* clipboard successfully set */ }, () => { /* clipboard write failed */ }); }
Использование execCommand()
Команды "cut" и "copy" метода document.execCommand() используются для замены содержимого буфера обмена выбранным материалом. Эти команды могут использоваться без каких-либо специальных разрешений в кратковременных обработчиках событий для действия пользователя (например, обработчике нажатия).
Например, предположим, что у вас есть всплывающее окно, которое включает в себя следующий HTML:
<input id="input" type="text" /> <button id="copy">Copy</button>
Чтобы кнопка "copy" копировала содержимое элемента <input>, вы можете использовать такой код:
function copy() { let copyText = document.querySelector("#input"); copyText.select(); document.execCommand("copy"); } document.querySelector("#copy").addEventListener("click", copy);
Поскольку вызов execCommand() находится внутри обработчика события нажатия, вам не нужны специальные разрешения.
Однако, предположим, что вы запускаете копирование из оповещения:
function copy() { let copyText = document.querySelector("#input"); copyText.select(); document.execCommand("copy"); } browser.alarms.create({ delayInMinutes: 0.1 }); browser.alarms.onAlarm.addListener(copy);
В зависимости от браузера, это может не сработать. В Firefox это не сработает, и вы увидите такое сообщение в консоли:
document.execCommand('cut'/'copy') was denied because it was not called from inside a short running user-generated event handler.
Для активации этого случая использования вам нужно запросить разрешение "clipboardWrite" разрешения. Таким образом: "clipboardWrite" позволяет вам записывать в буфер обмена вне кратковременного обработчика события для действия пользователя.
Примечание:document.execCommand() не работает с полями ввода type="hidden", с атрибутом HTML5 "hidden", или любой соответствующей CSS-правилом с использованием "display: none;". Поэтому, чтобы добавить кнопку "Скопировать в буфер обмена" в элемент span, div, или p, вам нужно использовать обходной путь, например, установить позицию поля ввода в абсолютную и вывести его за пределы области просмотра.
Особенности различных браузеров
Буфер обмена и другие используемые здесь API быстро развиваются, поэтому поведение в разных браузерах может отличаться.
В Chrome:
- Вам не нужно
"clipboardWrite", даже для записи в буфер обмена вне обработчика события, вызванного действием пользователя.
В Firefox:
-
navigator.clipboard.write()не поддерживается.
См. таблицы совместимости с браузерами для получения дополнительной информации.
Чтение из буфера обмена
В этом разделе описаны варианты чтения или вставки данных из буфера обмена.
Использование API буфера обмена
Методы navigator.clipboard.readText() и navigator.clipboard.read() API буфера обмена позволяют читать произвольные текстовые или двоичные данные из буфера обмена в безопасных контекстах. Это позволяет получить доступ к данным в буфере обмена без их вставки в редактируемый элемент.
После получения разрешения "clipboard-read" от API разрешений, вы можете легко читать из буфера обмена. Например, этот фрагмент кода извлекает текст из буфера обмена и заменяет содержимое элемента с идентификатором "outbox" этим текстом.
navigator.clipboard.readText().then((clipText) => document.getElementById("outbox").innerText = clipText);
Использование execCommand()
Для использования document.execCommand("paste") ваше расширение требует разрешение "clipboardRead" разрешения. Это имеет место даже если вы используете команду "paste" из обработчика события, инициированного пользователем, такого как click или keypress.
Рассмотрим HTML, который включает что-то вроде этого:
<textarea id="output"></textarea> <button id="paste">Paste</button>
Чтобы установить содержимое элемента <textarea> с идентификатором "output" из буфера обмена при нажатии на кнопку "paste" <button>, вы можете использовать такой код:
function paste() { let pasteText = document.querySelector("#output"); pasteText.focus(); document.execCommand("paste"); console.log(pasteText.textContent); } document.querySelector("#paste").addEventListener("click", paste);
Особенности различных браузеров
Firefox поддерживает разрешение "clipboardRead" разрешения начиная с версии 54, но поддерживает вставку только в элементы в режиме редактирования содержимого, который для скриптов содержимого работает только с <textarea>. Для фоновых скриптов любой элемент можно установить в режим редактирования содержимого.
Совместимость с браузерами
| Рабочий стол | Мобильные устройства | |||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Chrome | Edge | Firefox | Internet Explorer | Opera | Safari | WebView Android | Chrome Android | Firefox для Android | Opera Android | Safari на iOS | Samsung Internet | |
setImageData |
Нет | Нет | 57 | ? | Нет | Нет | ? | ? | 57 | ? | Нет | ? |
| Рабочий стол | Мобильные устройства | |||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Chrome | Edge | Firefox | Internet Explorer | Opera | Safari | WebView Android | Chrome Android | Firefox для Android | Opera Android | Safari на iOS | Samsung Internet | |
Interact_with_the_clipboard |
66 | 79 | 63 | Нет | 53 | 13.1 | 66 | 66 | 63 | 47 | 13.4 | 9.0 |
read |
86С версии 86 поддерживается тип MIMEtext/html.76С версии 76 поддерживается тип MIMEimage/png.66Изображения не поддерживаются. |
79 | 90Firefox поддерживает чтение буфера обмена только в расширениях браузера, используя разрешение расширения"clipboardRead". |
Нет | 63 | 13.1 |
84С версии 84 поддерживается тип MIMEimage/png.66Изображения не поддерживаются. |
86С версии 86 поддерживается тип MIMEtext/html.84С версии 84 поддерживается тип MIMEimage/png.66Изображения не поддерживаются. |
Нет | 54 | 13.4 | 12.0 |
readText |
66 | 79 | НетFirefox поддерживает чтение буфера обмена только в расширениях браузера, используя разрешение расширения"clipboardRead". |
Нет | 53 | 13.1 | 66 | 66 | НетFirefox поддерживает чтение буфера обмена только в расширениях браузера, используя разрешение расширения"clipboardRead". |
47 | 13.4 | 9.0 |
write |
66С версии 76 поддерживается тип MIMEimage/png. |
79 |
87Запись в буфер обмена доступна без разрешений в защищенных контекстах и расширениях браузера, но только из обработчиков событий, инициированных пользователем. Расширения браузера с разрешением"clipboardWrite" могут записывать в буфер обмена в любое время.63["Этот метод принимает объектDataTransfer вместо массива объектов ClipboardItem.", "Запись в буфер обмена доступна без разрешений в защищенных контекстах и расширениях браузера, но только из обработчиков событий, инициированных пользователем. Расширения браузера с разрешением \"clipboardWrite\" могут записывать в буфер обмена в любое время."] |
Нет | 63 | 13.1 | 66С версии 84 поддерживается тип MIMEimage/png. |
66С версии 84 поддерживается тип MIMEimage/png. |
Нет | 54 | 13.4 | 12.0 |
writeText |
66 | 79 | 63Запись в буфер обмена доступна без разрешений в защищенных контекстах и расширениях браузера, но только из обработчиков событий, инициированных пользователем. Расширения браузера с разрешением"clipboardWrite" могут записывать в буфер обмена в любое время. |
Нет | 53 | 13.1Должно вызываться внутри обработчиков событий пользовательского жеста, таких какpointerdown или pointerup. |
66 | 66 | 63Запись в буфер обмена доступна без разрешений в защищенных контекстах и расширениях браузера, но только из обработчиков событий, инициированных пользователем. Расширения браузера с разрешением"clipboardWrite" могут записывать в буфер обмена в любое время. |
47 | 13.4Должно вызываться внутри обработчиков событий пользовательского жеста, таких какpointerdown или pointerup. |
9.0 |
api.Буфер обмена
Таблицы BCD загружаются только в браузере
webextensions.api.Буфер обмена
Таблицы BCD загружаются только в браузере
См. также
© 2005–2023 MDN contributors.
Licensed under the Creative Commons Attribution-ShareAlike License v2.5 or later.
https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/Interact_with_the_clipboard