clipboard-polyfill
clipboard-polyfill
必要ありません。注: 2020 年現在、すべての主要ブラウザの安定バージョンでnavigator.clipboard.writeText(...)
を使用できます。このライブラリは、次のことを行う場合にのみ役立ちます。
text/html
をコピー、ClipboardItem
API を使用する、またはjsdom
) で API シェイプをポリフィルします。詳細については、以下の「互換性」セクションを参照してください。
Web 上でのコピーが次のように簡単になります。
clipboard . writeText ( "hello world" ) ;
このライブラリは、最新のPromise
ベースの非同期クリップボード API 用のポニーフィル/ポリフィルです。
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 仕様を確認してください。
注:
await
構文にはasync
関数を使用する必要があります。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 ビルドは提供されなくなりました。互換性を失わずにそのようなビルドを取得するには、 esbuild
介してclipboard-polyfill
ビルドを渡します。例えば:
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 にできるだけ近い動作をしようとします。 (免責事項と制限については上記を参照してください。)
Web 上のクリップボード アクセスのより長い歴史については、このプレゼンテーションを参照してください。
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 | ✅ | ✅ᵇ | |
IE9 | ✅ᶜ |
サポートを読む:
ブラウザ | readText() | read() (HTML) | read() (その他の形式) |
---|---|---|---|
サファリ13.1 | ☑️ | ☑️ | ☑️ ( image/uri-list 、 image/png ) |
クロム 76 /エッジ 79 | ☑️ | ☑️ ( image/png ) | |
クロム66ᵃ | ☑️ | ||
IE9 | ✅ᶜ | ||
ファイアーフォックス |
window.Promise
をポリフィルする必要があります。clipboard-polyfill
常に成功を報告します。ClipboardItem
コンストラクターに渡すオブジェクトの最後に、最も重要なデータ型を配置することを検討してください。text/html
データ型は、予期されるCF_HTML
形式を使用して書き込まれません。 1) 脆弱なブラウザのバージョン スニッフィングが必要になるため、 clipboard-polyfill
これを回避しようとしません。2) Edge のユーザーは通常、バージョン 17 未満でスタックすることはなく、3) 他のブラウザの障害モードは無効なクリップボードであるためです。 HTMLがコピーされます。 (エッジのバグ #14372529、#73) clipboard-polyfill
互換性のバグを回避するためにさまざまなヒューリスティックを使用します。上記のブラウザのいずれかで互換性の問題が発生した場合は、お知らせください。
ブラウザ | 最初のバージョンのサポートnavigator.clipboard.writeText(...) | 発売日 |
---|---|---|
クロム | 66歳以上 | 2018年4月 |
ファイアーフォックス | 53+ | 2018年10月 |
角 | 79+ (最初の Chromium ベースのリリース) | 2020年1月 |
サファリ | 13.1+ | 2020年3月 |
このプロジェクトは、JS でのクリップボード アクセスがかろうじて可能になりつつあり、人間工学に基づいたクリップボード API の取り組みが停滞していた時期に遡ります。 (もう少し詳しい内容については、このプレゼンテーションを参照してください。) 幸いなことに、2020 年以降、同じ機能を備えた人間工学に基づいた API がすべての最新ブラウザーで利用できるようになりました。
document.execCommand("copy")
呼び出しのサポートを開始しました (非常に多くの問題がありました)。clipboard.js
として開始しました (@zenorocha が同じ名前を付ける半年前?)。crbug.com/593475
など)。v2
API のオーバーホールを反映するために、このプロジェクトの名前をclipboard-polyfill
に変更しました。navigator.clipboard.writeText()
サポートを開始します。navigator.clipboard.write()
サポートを開始します ( text/html
サポートを含む)。非同期クリップボード API の実現にご協力いただいた Gary Kacmarcik 氏、Hallvord Steen 氏、その他の方々に感謝します。
最新のブラウザでテキストをコピーするだけの場合は、 navigator.clipboard.writeText()
を直接使用することを検討してください: https://caniuse.com/mdn-api_clipboard_writetext
古いブラウザでもテキストをコピーする必要がある場合は、この要点を使って簡単なハッキング ソリューションを試すこともできます。