menu
書いてる野郎
orebike@gmail.com
クリップボードをペーストした場合
このような感じで操作できる。これは Chrome の挙動。
mytextarea.addEventListener("paste", function(e){ for(let item of e.clipboardData.items){ console.log(item.type) var file = item.getAsFile(); } });
for で回しているのは別にクリップボードに履歴とかがあるわけでなく、状況やコピーした内容によってはこの items が複数になる場合がある。このような場合は type などで判定して continue で欲しいモノが見つかるまで飛ばすという操作が必要になる。
paste イベントで発生するイベントから取得する clipboardData は全項目変更不可能でペースト時にはクリップボードの内容を変更できない。
一応仕様としてはこんだけあるっぽいが、Web で JS で制御するとなると事実上、text/plain と image/png しか無い。
| text/plain | 単なるテキスト |
| text/uri-list | |
| text/csv | |
| text/css | |
| text/html | |
| application/xhtml+xml | |
| image/png | 画像一式。クリップボードの元の画像が何であろうとクリップボード中の画像となったらとりあえず PNG なようだ |
| image/jpg, image/jpeg | |
| image/gif | |
| image/svg+xml | |
| application/xml, text/xml | |
| application/javascript | |
| application/json | |
| application/octet-stream |
現状ではアニメーションGIF画像をクリップボードにコピーしてもその動きは失われて、単なる PNG としてペーストされる。 なので2019年現在それはできない。
このハンドラはそのまま終了するならばクリップボードの内容がそのままペーストされてしまう。
ペーストでは無く独自の処理をしたいならペーストをキャンセルしたい。
mytextarea.addEventListener("paste", function(e){ e.preventDefault(); });
このように記述するとペーストがキャンセルされる。
前述の通り、clipboardData はすべて変更不能なのでペーストする内容を書き換えてペーストはできない。
おそらくペーストしたいのは input text とか textarea の内部だとは思うが、 クリップボードの中身は書き換えられないので、ペーストをキャンセルして自前で value に突っ込むことで実現する。