実現したいこと
動的に作成されるbuttonタグにaddEventListenerを付与し、buttonタグの削除機能を実装したい。
また、buttonタグのindexとfilesのindexを紐づけ、タグが削除されるとfilesからも削除されるようにしたい。
前提
ここに質問の内容を詳しく書いてください。
以下の要件でファイルアップロード機能を作成しています。
・ファイルを選択またはドラッグすると、選択済ファイルとしてファイル名が画面に表示される。
・選択した複数ファイルを一括でアップロードできる。
・選択したファイルは×ボタンで取り消しが可能。
tagDeleteが発火すると紐付くbuttonタグが消えるところまでは確認できましたが、fileDeleteがうまく挙動しません。
例えばファイルを3つ選択した後、0番目のファイルを消したときにconsoleに表示されるのは"0"のみであってほしいのですが、for文が回った回数だけ(この場合3回)0が表示されます。
※本来、fileDeleteにindexを渡してfileList.filesから該当のファイルを消す処理を入れたいのですが、今は確認のためconsole.logでindexを表示するのみにしています。
また、ドラッグ部分まで処理が追い付いていないのでその部分は無視してください。
ごちゃごちゃやってしまったので中途半端な見づらいコードで申し訳ありませんが、お知恵を拝借できればと思います。
該当のソースコード
html
1<div>アップロード用画面です</div> 2<form action="test.html" method="post" enctype="multipart/form-data" > 3 <div id="upFileWrap"> 4 <div id="inputFile"> 5 <!-- ドラッグ&ドロップエリア --> 6 <p id="dropArea"> 7 アップロードするファイルをドロップ<br />またはファイルを選択してください 8 </p> 9 10 <!-- 通常のinput[type=file] --> 11 <div id="inputFileWrap"> 12 <input type="file" name="uploadFile" id="uploadFile" multiple/> 13 <div id="btnInputFile"><span>ファイルを選択</span></div> 14 </div> 15 </div> 16 <div id="droppedFile"></div> 17 <div id="sendBtnArea"> 18 <button id="sendBtn">アップロード</button> 19 </div> 20 <div>ドロップ済 21 <ul id="showFiles"></ul> 22 </div> 23 </form>
js
1// ドラッグ&ドロップエリアの取得 2var fileArea = document.getElementById("dropArea"); 3 4// input[type=file]の取得 5var fileInput = document.getElementById("uploadFile"); 6var showFiles = document.getElementById('showFiles'); 7var fileList = new DataTransfer(); 8var fileDelete; 9var tagDelete; 10var allDroppedFiles = []; 11 12fileDelete = function(e){ 13 //本来ここでfileList.files[this.name]を削除してfileInput.filesに入れたい。 14 console.log(this.name); 15} 16 17tagDelete = function(){ 18 this.closest('li').remove(); 19 } 20 21// ドラッグオーバー時の処理 22fileArea.addEventListener("dragover", function (e) { 23 e.preventDefault(); 24 fileArea.classList.add("dragover"); 25}); 26 27// ドラッグアウト時の処理 28fileArea.addEventListener("dragleave", function (e) { 29 e.preventDefault(); 30 fileArea.classList.remove("dragover"); 31}); 32 33// ドロップ時の処理 34fileArea.addEventListener("drop", function (e) { 35 e.preventDefault(); 36 fileArea.classList.remove("dragover"); 37 38 // ドロップしたファイルの取得 39 //dt.items.add(e.dataTransfer.files[0]); 40 41 // 取得したファイルをinput[type=file]へ 42 //fileInput.files = dt.files; 43 44 if (typeof files[0] !== "undefined") { 45 //ファイルが正常に受け取れた際の処理 46 } else { 47 //ファイルが受け取れなかった際の処理 48 } 49}); 50 51//ドロップ済ファイル表示 52fileInput.addEventListener('change', (e) => { 53 allDroppedFiles.forEach(allDroppedFile => { 54 allDroppedFile.removeEventListener('click', event); 55 }); 56 console.log('全てのイベントリスナーが削除されました'); 57 58 const files = e.target.files; 59 for (let i = 0; i < files.length; i++) { 60 const li = document.createElement('li'); 61 const btn = document.createElement('button'); 62 btn.textContent = "×"; 63 btn.className = 'deleteBtn'; 64 li.textContent = files[i].name; 65 li.appendChild(btn); 66 showFiles.appendChild(li); 67 fileList.items.add(files[i]); 68 } 69 70 allDroppedFiles = document.querySelectorAll('.deleteBtn'); 71 //console.log(allDroppedFiles.length); 72 for (let index = 0; index <allDroppedFiles.length; index++){ 73 allDroppedFiles[index].addEventListener("click",tagDelete); 74 //allDroppedFiles[index].addEventListener("click",fileDelete); 75 allDroppedFiles[index].addEventListener("click",{name: index, handleEvent: fileDelete}); 76 } 77}); 78

回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2025/06/26 05:48