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

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

新規登録して質問してみよう
ただいま回答率
85.46%
JavaScript

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

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

Q&A

1回答

1179閲覧

複数の画像アップロードするフォームでプレビュー表示箇所を指定する

creative_09

総合スコア80

JavaScript

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

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

0グッド

0クリップ

投稿2020/06/26 02:13

複数の画像アップロードするフォームがあります
画像をアップロードした場合にプレビューを表示しますが、
それぞれアップロードしたフォームの横へプレビューを表示したいと思っていますが、
2番めのフォームへアップロードしても1番目のプレビューへ表示されます。
プレビュー表示部分が一番目と二番目で同じなので当たり前なのですが
プレビュー箇所をそれぞれのinputフォーム横に指定するにはどうすればいいのでしょうか?

//ひとつめのアップロードフォーム <div class="form-group"> <label for="file_img_111" class=""> <div class="userProfileImg_description">画像をアップロード</div> <i class="fas fa-camera fa-3x"></i> <input type="file" id="file_img_prize" name="img_111[]"> </label> <div class="userImgPreview" id="userImgPreview"> <img id="thumbnail" class="userImgPreview_content" accept="image/*" src=""> <p class="userImgPreview_text">画像をアップロード済み</p> </div> </div> //ふたつめのアップロードフォーム <div class="form-group"> <label for="file_img_222" class=""> <div class="userProfileImg_description">画像をアップロード</div> <i class="fas fa-camera fa-3x"></i> <input type="file" id="file_img_prize" name="img_222[]"> </label> <div class="userImgPreview" id="userImgPreview"> <img id="thumbnail" class="userImgPreview_content" accept="image/*" src=""> <p class="userImgPreview_text">画像をアップロード済み</p> </div> </div>
<script> $("INPUT[id^='file_']").on("change", function(e) { var file = e.target.files[0]; // 画像ファイル以外は処理停止 if(file.type.indexOf('image') < 0){ alert("画像ファイルを指定してください。"); return false; } console.log(e.target.id + " がクリックされました。"); if (e.target.files.length) { reader = new FileReader(); reader.onload = function (e) { var userThumbnail; userThumbnail = document.getElementById('thumbnail'); $("#userImgPreview").addClass("is-active"); userThumbnail.setAttribute('src', e.target.result); }; return reader.readAsDataURL(e.target.files[0]); } }); </script>

やってみたこと

//js側 div = document.getElementByClassName('file_img_111');//新たにHTML側へclassを追加 userThumbnail = div.getElementById('thumbnail');
//html側 <div class="file_img_111"> <div class="userImgPreview" id="userImgPreview"> <img id="thumbnail" class="userImgPreview_content" accept="image/*" src=""> <p class="userImgPreview_text">画像をアップロード済み</p> </div> </div> <div class="file_img_222"> <div class="userImgPreview" id="userImgPreview"> <img id="thumbnail" class="userImgPreview_content" accept="image/*" src=""> <p class="userImgPreview_text">画像をアップロード済み</p> </div> </div>

よろしくおねがいします

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

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

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

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

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

yambejp

2020/06/26 02:26

enctypeをmultipart/form-data設定したformが見当たりませんが 最終的にサーバーへの送信はしないのでしょうか?
creative_09

2020/06/26 02:30

全体的なフォームはひとつで、一つのフォームの中でインプット要素として複数の画像がアップロードできる形でした 複数のフォームがあるような言い方となっていますが申し訳ございません また、最終的にサーバーへは送信し、送信の受け取りもできています プレビュー箇所が最初のインプットの場所一箇所になってしまうのをそれぞれの箇所へプレビューさせたいのです。 確認画面でなどといった話でもありません。誤解を招いていたらすみません よろしくお願い致します
guest

回答1

0

HTMLの仕様上 idは同一HTML上で重複できません。別のものをつけるか、クラスにでもしましょう。

js

1$( e.target ).closest( '.form-group' ).find( '.userImgPreview' ).addClass( 'is-active' );

【.closest() | jQuery API Documentation】
https://api.jquery.com/closest/

投稿2020/06/26 02:28

kei344

総合スコア69458

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

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

creative_09

2020/06/26 03:12

ありがとうございます。 userThumbnail = document.getElementById('thumbnail'); $("#userImgPreview").addClass("is-active"); userThumbnail.setAttribute('src', e.target.result); }; の箇所を提示していただいたコードを追加し userThumbnail = document.getElementById('thumbnail'); //$("#userImgPreview").addClass("is-active");    $( e.target ).closest( '.form-group' ).find( '.userImgPreview' ).addClass( 'is-active' ); userThumbnail.setAttribute('src', e.target.result); }; のようにすると'is-active' idが追加されず、 この外で記述するとうまくいきました。 そとで使うと、setAttribute('src', e.target.result)が」うまく動かないです idは重複してはダメなんですね。 勉強になります
kei344

2020/06/26 03:18

「 $("INPUT[id^='file_']").on("change", function(e)」と「reader.onload = function (e)」とで同じ仮引数を使っているからそうなりますね。 また、提示したのは方法だけで、そこを書き換えたら全部解決するコードではありません。「userThumbnail = document.getElementById('thumbnail');」も同じようにjQueryで取得してjQueryで値を書き換えましょう。
creative_09

2020/06/26 03:37

勉強になります なるほどと思いなながら、調べて理解しながらやっているつもりですが、srcに値が入ってくれません 一番近い親要素.form-groupを探し、みつかればis-activeをつける。 ということを理解しました $( e.target ).closest( '.form-group' ).find( '.userImgPreview' ).addClass( 'is-active' ); $( e.target ).closest( '.form-group' ).find( '#thumbnail' ).setAttribute('src', e.target.result); このようにし、 「reader.onload = function (e)」部分はコメントアウトしました if (e.target.files.length) { reader = new FileReader(); $( e.target ).closest( '.form-group' ).find( '.userImgPreview' ).addClass( 'is-active' ); $( e.target ).closest( '.form-group' ).find( '#thumbnail' ).setAttribute('src', 'yyyyyy'); // $( e.target ).closest( '.form-group' ).find( '.thumbnail' ).setAttribute('src', e.target.result); // reader.onload = function (e) { // var userThumbnail; // userThumbnail = document.getElementById('thumbnail'); // $("#userImgPreview").addClass("is-active"); // userThumbnail.setAttribute('src', e.target.result); // }; return reader.readAsDataURL(e.target.files[0]); } srcに値が入ってくれません。。
creative_09

2020/06/26 03:39

// $( e.target ).closest( '.form-group' ).find( '#thumbnail' ).setAttribute('src', 'yyyyyy'); $( e.target ).closest( '.form-group' ).find( '.thumbnail' ).setAttribute('src', e.target.result); としています
kei344

2020/06/26 03:46

> 「reader.onload = function (e)」部分はコメントアウトしました e.target.result の e はここで宣言しているものだからそうなります。
creative_09

2020/06/26 04:10

この状態でsrcに値が入ってくれないのはなぜでしょうか。
kei344

2020/06/26 04:27

e.target.resultが無いから。
creative_09

2020/06/26 04:32

$( e.target ).closest( '.form-group' ).find( '.userImgPreview' ).addClass( 'is-active' ); $( e.target ).closest( '.form-group' ).find( '#thumbnail' ).setAttribute('src', e.target.result); のようにしていますが、 product:665 Uncaught TypeError: $(...).closest(...).find(...).setAttribute is not a function というエラーがでています
kei344

2020/06/26 04:35

onload 内じゃないとe.target.resultが採れないのはわかっていますか? あと、jQueryにsetAttribute なんてメソッドはないですよ。 【.attr() | jQuery API Documentation】 https://api.jquery.com/attr/
creative_09

2020/06/26 04:55

少しづつ見えてきた気がします もう少しあれこれしてみます。 何を調べるか何をみるか教えていただけて助かります
creative_09

2020/06/26 12:39

以下のような感じでimage_fileというクラスを付与しました。 <div class="form-group image_file"> <label for="file_img_product" class=""> <div class="userProfileImg_description">商品メイン画像</div> <i class="fas fa-camera fa-3x"></i> <input type="file" id="file_img_product" name="img_product"> </label> <div class="userImgPreview" id="userImgPreview"> <img id="thumbnail" class="userImgPreview_content" accept="image/*" src=""> <p class="userImgPreview_text">商品のメイン画像をアップロード済み</p> </div> </div> <script> $(".image_file").on("change", function(e) { var file = e.target.files[0]; var find_thumbnail = $(this).children().find('#thumbnail'); // 画像ファイル以外は処理停止 if(file.type.indexOf('image') < 0){ alert("画像ファイルを指定してください。"); return false; } console.log(e.target.id + " がクリックされました。"); if (e.target.files.length) { reader = new FileReader(); $( e.target ).closest( '.form-group' ).find( '.userImgPreview' ).addClass( 'is-active' ); reader.onload = function (e) { find_thumbnail.attr('src', e.target.result); }; return reader.readAsDataURL(e.target.files[0]); } }); </script> のように書いてみたところ、思った通りの動作が出来ました。 ありがとうございます。!! ただ、偶然できただけのような感じもしますので、 おかしいところなどはないでしょうか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問