前提・実現したいこと
初学者のため至らない点ばかりですがお手柔らかにお願いします。
html, jsで、パワーポイントのように作業エリア内で文章や画像をペーストすることができ、かつそれらを動かせるというサイトを作成しようとしています。
具体的には、サイトの決められた領域内でペーストを行うと、クリップボード内のデータが画像・テキストに関わらず張り出されるといった感じです。
ctrl+vが押された時にクリップボードからテキスト情報を得てペーストすることは成功したのですが、画像をペーストすることが出来ません。そのため画像をクリップボードから取り出し画像として貼り出す方法を教えていただきたいです。
よろしくお願いします。
発生している問題・エラーメッセージ
Uncaught (in promise) TypeError: Cannot read property 'getAsFile' of undefined at var imageFile = e.clipboardData.items[0].getAsFile();
該当のソースコード
html
1<style> 2.abs { 3 position: absolute; 4} 5</style> 6<body> 7<div id="textareas" contenteditable="true"></div> 8</body> 9<script> 10document.addEventListener('paste', function(e){ 11 if(x>220 & y>89){ 12 var area = document.getElementById("textareas"); 13 if (navigator.clipboard) { 14 navigator.clipboard.readText() 15 .then(function (text) { 16 if(text==""){ 17 var imageFile = e.clipboardData.items[0].getAsFile(); 18 var fr = new FileReader(); 19 fr.onload = function(e) { 20 img_count++; 21 var base64 = e.target.result; 22 document.querySelector("#outputImage").src = base64; 23 area.innerHTML = temp + "<div class='abs' id=" + img_count + " style=' top: " + y + "px; left:" + x + "px;'><img src=" + base64 + " id='num" + img_count + "' ></div>" 24 } 25 fr.readAsDataURL(imageFile); 26 } 27 else{ 28 text_count++; 29 area.innerHTML = temp + "<div class='abs' id=" + text_count + " style=' top: " + y + "px; left:" + x + "px;'><input textarea value=" + text + " id='num" + text_count + "' ></div>" 30 }}); 31 } 32 temp = area.innerHTML; 33 } 34 }) 35 </script> 36 37 38<!-- 試したコードを併記しています 39document.addEventListener('keydown', (event) => { 40 const keyName = event.key; 41 if (event.ctrlKey||event.metaKey) { 42 if (keyName == "v") { 43 if(x>220 & y>89){ 44 var area = document.getElementById("textareas"); 45 if (navigator.clipboard) { 46 navigator.clipboard.readText() 47 .then(function (text) { 48 if(text==""){ 49 img_count++; 50 navigator.clipboard.read() 51 .then(function (img){ 52 // console.log(img); 53 area.innerHTML = temp + "<div class='abs' id=" + img_count + " style=' top: " + y + "px; left:" + x + "px;'><input type='image' src="+ img +" value=" + img + " id='num" + img_count + "' ></div>" 54 }) 55 } 56 else{ 57 text_count++; 58 area.innerHTML = temp + "<div class='abs' id=" + text_count + " style=' top: " + y + "px; left:" + x + "px;'><input textarea value=" + text + " id='num" + text_count + "' ></div>" 59 }}); 60 } 61 temp = area.innerHTML; 62 } 63 } 64 } 65}, false); --> 66 67
試したこと
画像とテキストを別の関数として分けて実行してみたのですが、画像の生成はうまく行きませんでした。
上記コメントアウト内の関数の場合、出力はされるものの画像の表示にエラーが起きているようでした。
GET (url)[object 404 (Not Found)というエラーコードが表示されてしまいました
補足情報(FW/ツールのバージョンなど)
こちらの記事を参考にさせていただきました。
https://qiita.com/tatesuke/items/00de1c6be89bad2a6a72
xとyはmouse座標になっています。
ブラウザはchromeです
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/01/14 12:10
2021/01/14 12:29
2021/01/14 13:27
2021/01/14 14:58
2021/01/15 05:25