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

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

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

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

Q&A

解決済

1回答

1255閲覧

input type file プレビュー画像のリセット、同一ページ内に複数ある場合。

退会済みユーザー

退会済みユーザー

総合スコア0

JavaScript

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

0グッド

0クリップ

投稿2021/10/28 04:56

編集2021/10/28 05:18

こちらの私の質問の続きになります。
input type file プレビュー画像のリセット

おかげさまで、
input file プレビュー画像のリセットができました。

しかし1点、私にとって不都合がありました。
それは、<form></form>が複数ある場合です。
.previewと.deleteの全てremoveの対象になってしまいます。

実現したいことは、
同一ページ内に<form>タグが複数あり
それぞれ独立しています。
中身の要素は同じです。

それぞれのformにある、
type=fileにて、画像のリセットが独立している、他のformに影響を与えない仕様になります。

これを、隣接する、もしくは同じ階層の
.previewと.deleteのみをremoveの対象とするコードにすれば
解決できると思いましたが、試行錯誤しているのですが分かりません。

アドバイス頂ければ幸いです。
どうぞよろしくお願い致します。

javascript

1$(function(){ 2$('input[type=file]').on('change', function () { 3var self=$(this); 4var file = $(this).prop('files')[0]; 5var reader = new FileReader(); 6reader.addEventListener('load',e=>{ 7$('.preview').remove(); 8$('.delete').remove(); 9self.closest('.camera-wrap') 10.append($('<img class="preview">').attr({src:e.target.result})) 11.append($('<button type="reset" class="delete"></button>')); 12}); 13reader.readAsDataURL(file); 14}); 15$('form').on('reset',function(){ 16$('.preview').remove(); 17$('.delete').remove(); 18}); 19});

html

1<form method="post" enctype="multipart/form-data"> 2<div class='camera-wrap'><label class='camera' for='camera'><input type="file" id='camera' name='file'></label></div> 3</form>

以下がinput fileがクリックされたときのコードになります。

html

1<form method="post" enctype="multipart/form-data"> 2<div class="camera-wrap"><label class="camera" for="camera"><input type="file" id="camera" name="file"></label><img class="preview" src=""><button type="reset" class="delete"></button></div> 3</form> 4 5<form method="post" enctype="multipart/form-data"> 6<div class="camera-wrap"><label class="camera" for="camera497"><input type="file" id="camera497" name="file"></label><img class="preview" src=""><button type="reset" class="delete"></button></div> 7</form>

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

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

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

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

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

yambejp

2021/10/28 05:04 編集

仕様をもう少し詳しく説明ください type=fileが2箇所あるとして、両方とも送るなら同じformに入れる必要があります (例示のものは別々のフォームに入っていますが、これだと排他的にしかサブミットできないです) 同じformにおいてリセットボタンはすべてのinput 要素をリセットしてはいけないのでしょうか? 個別にファイルごとにリセットボタンが必要? その場合全体リセットは不要?
退会済みユーザー

退会済みユーザー

2021/10/28 05:15

type=fileは2箇所あり、それぞれ独立しております。 それぞれ、画像のプレビュー表示と画像のリセットをしたいです。独立していて影響されない。 同じformにおいて、リセットボタンはtype=fileのみリセットしたいです。それ以外のtype=textなどはリセットされない。 全体リセットが何を指すか、勉強不足で分かりかねます。申し訳ございません。伝われば良いのですが。 今から質問内容を追加いたします。
guest

回答1

0

ベストアンサー

普通にやるならこんな感じ

javascript

1<script> 2$(function(){ 3 $('input[type=file]').on('change', function () { 4 var self=$(this); 5 var file = $(this).prop('files')[0]; 6 var reader = new FileReader(); 7 reader.addEventListener('load',e=>{ 8 self.closest('label').find('.preview,.delete').remove().end() 9 .append($('<img class="preview">').attr({src:e.target.result})) 10 .append($('<button type="button" class="delete">削除</button>')); 11 }); 12 reader.readAsDataURL(file); 13 }); 14 $(document).on('click','.delete',function(){ 15 $(this).closest('.camera-wrap').find('.preview,.delete').remove().end().find('[type=file]').val(''); 16 }); 17 $('form').on('reset',function(){ 18 $(this).find('.preview,.delete').remove(); 19 }); 20}); 21</script> 22<form method="post" enctype="multipart/form-data"> 23<input type="text" name="test"> 24<div class="camera-wrap"> 25<label class="camera"> 26<input type="file" name="file[]"> 27</label> 28</div> 29<div class="camera-wrap"> 30<label class="camera"> 31<input type="file" name="file[]"> 32</label> 33</div> 34<button type="reset">リセット</button> 35<button type="submit" >送信</button> 36</form>

ファイルを複数おくる必要がないならプレビューを残しておくのは混乱のもとでは?

form分割パターン

どれかで画像を選んだら別の画像は削除

javascript

1<script> 2$(function(){ 3 $('input[type=file]').on('change', function () { 4 var self=$(this); 5 var file = $(this).prop('files')[0]; 6 var reader = new FileReader(); 7 $('.preview,.delete').remove(); 8 $('[type=file]').not($(this)).val(""); 9 reader.addEventListener('load',e=>{ 10 self.closest('label') 11 .append($('<img class="preview">').attr({src:e.target.result})) 12 .append($('<button type="button" class="delete">削除</button>')); 13 }); 14 reader.readAsDataURL(file); 15 }); 16 $(document).on('click','.delete',function(){ 17 $(this).closest('.camera-wrap').find('.preview,.delete').remove().end().find('[type=file]').val(''); 18 }); 19 $('form').on('reset',function(){ 20 $(this).find('.preview,.delete').remove(); 21 }); 22}); 23</script> 24<form method="post" enctype="multipart/form-data"> 25<input type="text" name="test"> 26<div class="camera-wrap"> 27<label class="camera"> 28<input type="file" name="file[]"> 29</label> 30</div> 31<button type="reset">リセット</button> 32<button type="submit" >送信</button> 33</form> 34<form method="post" enctype="multipart/form-data"> 35<input type="text" name="test"> 36<div class="camera-wrap"> 37<label class="camera"> 38<input type="file" name="file[]"> 39</label> 40</div> 41<button type="reset">リセット</button> 42<button type="submit" >送信</button> 43</form>

投稿2021/10/28 05:21

編集2021/10/28 06:51
yambejp

総合スコア115012

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

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

退会済みユーザー

退会済みユーザー

2021/10/28 05:27

ありがとございます。 頂いた内容をもとに実装をしてみます。 説明が足らず申し訳ございません。 用途をご説明すると、例えば、 飲食店のメニューの登録です。 メニュー名と画像を登録する。 同一ページ内に、 登録済みのメニューが一覧表示されている。そのときに、プレビュー画像があった方が良いと思っています。 ご指摘の通りファイルは一つのみ送るのですが、自分がセレクトした画像がプレビューであった方がわかりやすいのでは?と考えています。 アドバイス頂きありがとございます。 これから試させていただきます。
yambejp

2021/10/28 05:33 編集

私の説明もわかりづらかったかもしれません 1つ目のtype=fileでAを選択したとして、やはり別のBを送ろうと思い Bを改めて選択するとします。 いざサーバーにファイルを送るときにBしか送らないのであればAのプレビューが 残っていると、あたかもAも一緒に送るかのようにユーザーは認識してしまうので formをわける(つまりAかBのどちらかしか送らない)場合であっても 他のプレビューは消すべきだ・・・ということです 一方、AもBも送るということであればformを一つにして、私の回答の通り組み込めばよいです
退会済みユーザー

退会済みユーザー

2021/10/28 06:35

ご説明ありがとうございます。 おかげさまで実装できました。 >他のプレビューは消すべきだ・・・ということです その仕様のつもりでした。 現状、 1つ目のtype=fileでAを選択したとして、Aのプレビューが表示される。 やはり別のBを送ろうと思いBを改めて選択するとします。 そのときに、Aのプレビューが消えて、Bのプレビューが表示されます。 いろいろと私が勘違いをしている部分があると思いますが。
yambejp

2021/10/28 06:55

念の為フォームを分けたバージョンを用意しました Aを選んだらBのプレビューや削除ボタンがきえるようにしてあります
退会済みユーザー

退会済みユーザー

2021/10/28 06:59

恐れ入ります。 拝見いたします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問