回答編集履歴

2

追記修正

2021/01/15 05:23

投稿

umau
umau

スコア805

test CHANGED
@@ -32,7 +32,11 @@
32
32
 
33
33
 
34
34
 
35
- キャプチャ画像そのものであるなら、itemsが0になる事はないはず。
35
+ ~~キャプチャ画像そのものであるなら、itemsが0になる事はないはず。~~
36
+
37
+ (追記参照)
38
+
39
+
36
40
 
37
41
 
38
42
 
@@ -84,7 +88,7 @@
84
88
 
85
89
  非同期APIを使用するなら、その後の読み込みも全部、非同期でやらないと駄目みたいです。
86
90
 
87
-
91
+ (EventListner実行時に渡される e.clipboardData.items の中身は、Promiseのthen によってコールバックが実行されるタイミングにおいては残っていない。)
88
92
 
89
93
 
90
94
 
@@ -110,11 +114,9 @@
110
114
 
111
115
  const txtBlob = await items[0].getType("image/png");
112
116
 
113
- var fr = new FileReader();
114
117
 
115
118
 
116
-
117
- var img = document.createElement("img")
119
+ const img = document.createElement("img")
118
120
 
119
121
  img.src = URL.createObjectURL(txtBlob);
120
122
 

1

追記

2021/01/15 05:23

投稿

umau
umau

スコア805

test CHANGED
@@ -67,3 +67,63 @@
67
67
  ```
68
68
 
69
69
  という処理が入っていますよね。この分岐を使えば、画像とそれ以外を切り分けて作る事ができるんじゃないでしょうか。
70
+
71
+
72
+
73
+
74
+
75
+
76
+
77
+ (追記)
78
+
79
+
80
+
81
+ 非同期のClipboardAPIを使用されていて、Promiseの実行時にEventListner内のclipboadが持ってるDataTransferの中身が消えてしまっているのがエラーの原因ぽいです。
82
+
83
+
84
+
85
+ 非同期APIを使用するなら、その後の読み込みも全部、非同期でやらないと駄目みたいです。
86
+
87
+
88
+
89
+
90
+
91
+ ```javascript
92
+
93
+ document.addEventListener('paste', async e => {
94
+
95
+ if (!e.clipboardData
96
+
97
+ || !e.clipboardData.types
98
+
99
+ || (e.clipboardData.types.length != 1)
100
+
101
+ || (e.clipboardData.types[0] != "Files")) {
102
+
103
+ return true;
104
+
105
+ }
106
+
107
+
108
+
109
+ const items = await navigator.clipboard.read();
110
+
111
+ const txtBlob = await items[0].getType("image/png");
112
+
113
+ var fr = new FileReader();
114
+
115
+
116
+
117
+ var img = document.createElement("img")
118
+
119
+ img.src = URL.createObjectURL(txtBlob);
120
+
121
+ document.body.appendChild(img);
122
+
123
+ })
124
+
125
+ ```
126
+
127
+
128
+
129
+ (参考)[W3C - ClipboardAPI](https://www.w3.org/TR/clipboard-apis/#dom-clipboard-read)