実現したいこと
複数枚の画像が投稿できるようにしたい。
選択した画像はプレビューを表示したい。
前提
フリマアプリを作っています。
商品を出品する際に画像を複数選択できるようにしたい。
一枚目を選択すると一枚目のプレビューが表示され、二枚目投稿用のボタンを表示するところまでは成功しています。
発生している問題・エラーメッセージ
エラーメッセージの表示はありません。
二枚目以降もプレビューと次の画像の選択用のボタンを表示したいのですが上手くいきません。
49行目のnewFileField.addEventListener("change", changedFileField);を追加すると一枚目のプレビューや二枚目の投稿ボタンも表示されなくなります
該当のソースコード
preview.js
ruby
1document.addEventListener('DOMContentLoaded', function(){ 2 // 新規投稿・編集ページのフォームを取得 3 const postForm = document.getElementById('new_item'); 4 // 新規投稿・編集ページのフォームがないならここで終了。「!」は論理否定演算子。 5 const previewList = document.getElementById('previews'); 6 if (!postForm) return null; 7 console.log("preview.jsが読み込まれました"); 8 9 10 // input要素を取得 11 const fileField = document.querySelector('input[type="file"][name="item[images][]"]'); 12 // input要素で値の変化が起きた際に呼び出される関数 13 fileField.addEventListener('change', function(e){ 14 15 // data-index(何番目を操作しているか)を取得 16 const dataIndex = e.target.getAttribute('data-index'); 17 console.log( dataIndex); 18 19 20 const file = e.target.files[0]; 21 const blob = window.URL.createObjectURL(file); 22 23 // 画像を表示するためのdiv要素を生成 24 const previewWrapper = document.createElement('div'); 25 previewWrapper.setAttribute('class', 'preview'); 26 previewWrapper.setAttribute('data-index', dataIndex); 27 // 表示する画像を生成 28 const previewImage = document.createElement('img'); 29 previewImage.setAttribute('class', 'preview-image'); 30 previewImage.setAttribute('src', blob); 31 32 // 生成したHTMLの要素をブラウザに表示させる 33 previewWrapper.appendChild(previewImage); 34 previewList.appendChild(previewWrapper); 35 36 // 2枚目用のfile_fieldを作成 37 const newFileField = document.createElement('input'); 38 newFileField.setAttribute('type', 'file'); 39 newFileField.setAttribute('name', 'item[images][]'); 40 41 42 // 最後のfile_fieldを取得 43 const lastFileField = document.querySelector('input[type="file"][name="item[images][]"]:last-child'); 44 // nextDataIndex = 最後のfile_fieldのdata-index + 1 45 const nextDataIndex = Number(lastFileField.getAttribute('data-index')) +1; 46 newFileField.setAttribute('data-index', nextDataIndex); 47 48 // 追加されたfile_fieldにchangeイベントをセット 49 newFileField.addEventListener("change", changedFileField); 50 51 // 生成したfile_fieldを表示 52 const fileFieldsArea = document.querySelector('.click-upload'); 53 fileFieldsArea.appendChild(newFileField); 54 55 56 }); 57}); 58 59
フォームの該当部
ruby
1 <div class="img-upload"> 2 <div class="weight-bold-text"> 3 商品画像 4 <span class="indispensable">必須</span> 5 </div> 6 <div class="click-upload"> 7 <p> 8 クリックしてファイルをアップロード 9 </p> 10 <div id="previews"></div> 11 <%= f.file_field :images, name: 'item[images][]', data: {index: 0}, id:"item-image" %> 12 13 </div> 14 </div>
試したこと
preview.jsの読み込みはうまくいってる
調べましたが全くわからず困っています
補足情報(FW/ツールのバージョンなど)
rubyのバージョンは6.0.0です。

バッドをするには、ログインかつ
こちらの条件を満たす必要があります。