前提・実現したいこと
以下のようなフローでファイルをアップできるようなページを作成しています。(jQueryを使用)
・html上の「ローカルファイルを選択」ボタンをクリック
・「ローカルファイルを選択」とは別の要素の見た目上見えなくしてある<input type=file>を.trigger("click")を使用して間接的に発火
・発火させた<input type="file">のイベントによりPCのファイルを選択し「開く」を押す
・ファイル情報を取得しファイル名を<div>input-file-boxという要素を作成後そこに出力
・次回分のinput要素を先ほど使用したinputの隣に追加
以上
再度同じフローを踏んでファイルを選択すると2つ目以降のファイル名が横にどんどん並ぶように追加されていくというような結果を想定しています。
以下ののコードにてファイルを選択した際は想定通りの出力結果を得られたのですが、
ファイルを選択するタイミングでキャンセルを押した後、もう一度最初の手順からファイルを選択し「開く」を押すとinput要素が2つ作成されてしまう事象が起きてしまいます。
推測としてはクリックイベントの後にchangeイベントが実行されず残ってしまい、
次の新しいクリックイベントを実行した際に止まっていたイベントが同時に動き要素が2つ作成されてしまっているのかと考えています。
ただ、その後の対処に詰まってしまい質問をさせていただくに至りました。
アドバイスのほどよろしくお願いいたします...!
発生している問題・エラーメッセージ
該当のソースコード
javascript
1 2 let addLocalFile = function(){ 3 let activeFileNum = $('#origin-file-input-elm').find('.input-local-file').length; 4 5 $('#local-file-' + activeFileNum).trigger("click"); 6 popInActivate(); 7 8 $('#local-file-' + activeFileNum).on('change', function(){ 9 let addFileNum = activeFileNum + 1; 10 let fileBoxElm = '<div class="input-file-box" id="input-file-box-' + activeFileNum + '"><div class="clip-icon"></div><div class="file-name"></div><button class="file-delete-icon" id="fille-' + activeFileNum + '></button></div>'; 11 $('#js-input-files-wrapper').append(fileBoxElm); 12 let fileObj = $('#local-file-' + activeFileNum).prop('files')[0]; 13 $('#input-file-box-'+ activeFileNum).find('.file-name').text(fileObj.name); 14 15 let fileInputElm = '<input class="input-local-file" id="local-file-' + addFileNum + '" type="file"></input>' 16 $('#clone-origin-file-input-elm').append(fileInputElm); 17 }); 18 } 19$("#js-open-local-file").click(addLocalFile);
html
1 <form class="form" action=""> 2 <div class="wrapper"> 3 <div class="input-files-wrapper" id="js-input-files-wrapper"> 4 <!--- このコメント内の要素にファイル名を出力してファイルを選択するごとに横に並べる 5 <div class="input-file-box" id="input-file-box-1"> 6 <div class="clip-icon"> </div> 7 <div class="file-name">ファイル名.zip</div> 8 <button class="file-delete-icon" id="fille-delete-1"></button> 9 --> 10 </div></div> 11 <div class="clone-origin-file-input-elm" id="clone-origin-file-input-elm"> 12 <input class="input-local-file" id="local-file-1" type="file"> 13 <!--- ここに input type=file を追加していく---> 14 </div> 15 16 </div> 17 18 </form> 19 <button id="js-open-local-file" type="button"> 20 ローカルファイルを選択 21 </button>
試したこと
changeイベントを addLocalFileの外側に出して試したりもしましたが、
そうするとactiveFilleNumの受け渡しがうまくできずファイル選択画面が開かない状態でした。
(同期的に処理すればよろしいのでしょうか...?ただそのやり方もイマイチ理解できずわからない状態なので、もしそうだとしたらその方法もお教えいただければ幸いです。)
javascript
1 let activeFileNum = ''; 2 let addLocalFile = function(){ 3 activeFileNum = $('#clone-origin-file-input-elm').find('.input-local-file').length; 4 console.log(activeFileNum); 5 $('#local-file-' + activeFileNum).trigger("click"); 6 popInActivate(); 7 8 } 9 10 $("#js-open-local-file").click(addLocalFile); 11 12 $('#local-file-' + activeFileNum).on('change', function(){ 13 let addFileNum = activeFileNum + 1; 14 let fileBoxElm = '<div class="c-input-file-box" id="input-file-box-' + activeFileNum + '"><div class="clip-icon"></div><div class="file-name"></div><button class="file-delete-icon" id="fille-delete-' + activeFileNum + '></button></div>'; 15 $('#js-input-files-wrapper').append(fileBoxElm); 16 let fileObj = $('#local-file-' + activeFileNum).prop('files')[0]; 17 $('#input-file-box-'+ activeFileNum).find('.file-name').text(fileObj.name); 18 19 let fileInputElm = '<input class="input-local-file" id="local-file-' + addFileNum + '" type="file"></input>' 20 $('#clone-origin-file-input-elm').append(fileInputElm); 21 });
補足情報(FW/ツールのバージョンなど)
jQuery 3.5.0
ブラウザはIE11まで対応できればと思います。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。