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 に突っ込むことで実現する。