質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Ruby on Rails 6

Ruby on Rails 6は、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

1回答

533閲覧

画像複数枚投稿時の各画像のプレビューの表示と投稿ボタンの表示に関して

oishi496

総合スコア0

Ruby on Rails 6

Ruby on Rails 6は、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

0クリップ

投稿2023/05/14 07:09

実現したいこと

複数枚の画像が投稿できるようにしたい。
選択した画像はプレビューを表示したい。

前提

フリマアプリを作っています。
商品を出品する際に画像を複数選択できるようにしたい。
一枚目を選択すると一枚目のプレビューが表示され、二枚目投稿用のボタンを表示するところまでは成功しています。

発生している問題・エラーメッセージ

エラーメッセージの表示はありません。
二枚目以降もプレビューと次の画像の選択用のボタンを表示したいのですが上手くいきません。
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です。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

js

1 newFileField.addEventListener("change", changedFileField);

コード中に changeFileField という関数がないようなので、動かなくなるのは当然ですね。
おそらく、13行目で addEventListener() に渡している関数に changeFileField という名前を付ければいいんじゃないでしょうか。

投稿2023/05/14 22:48

int32_t

総合スコア20845

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問