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

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

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

HTML5 (Hyper Text Markup Language、バージョン 5)は、マークアップ言語であるHTMLの第5版です。

JavaScript

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

jQuery

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

Q&A

解決済

2回答

9655閲覧

クリックイベントが複数実行される

asr1919

総合スコア16

HTML5

HTML5 (Hyper Text Markup Language、バージョン 5)は、マークアップ言語であるHTMLの第5版です。

JavaScript

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

jQuery

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

0グッド

0クリップ

投稿2019/04/22 08:16

前提・実現したいこと

https://codeday.me/jp/qa/20190301/345419.html

上記のサイトを元に、画像をアップロードして表示させましたが、「Remove image」を押下すると、

javascript

1$(this).parent(".pip").remove();

の処理が複数回実行(表示されている画像分だけ?)されてしまいます。
この行の下に処理を追加したいのですが、複数回実行されると値の増減などを行ったときに意図しない数値になるため、
1回に留めたいのですが、可能でしょうか。

よろしくお願いします。

環境:ローカル環境内で実行
ブラウザ:IE11、chrome

コード

javascript

1$(document).ready(function() { 2 if (window.File && window.FileList && window.FileReader) { 3 $("#files").on("change", function(e) { 4 var files = e.target.files, 5 filesLength = files.length; 6 for (var i = 0; i < filesLength; i++) { 7 var f = files[i] 8 var fileReader = new FileReader(); 9 fileReader.onload = (function(e) { 10 var file = e.target; 11 $("<span class=\"pip\">" + 12 "<img class=\"imageThumb\" src=\"" + e.target.result + "\" title=\"" + file.name + "\"/>" + 13 "<br/><span class=\"remove\">Remove image</span>" + 14 "</span>").insertAfter("#files"); 15 $(".remove").click(function(){ 16 $(this).parent(".pip").remove(); 17 }); 18 19 // Old code here 20 /*$("<img></img>", { 21 class: "imageThumb", 22 src: e.target.result, 23 title: file.name + " | Click to remove" 24 }).insertAfter("#files").click(function(){$(this).remove();});*/ 25 26 }); 27 fileReader.readAsDataURL(f); 28 } 29 }); 30 } else { 31 alert("Your browser doesn't support to File API") 32 } 33});

html

1<div class="field" align="left"> 2 <h3>Upload your images</h3> 3 <input type="file" id="files" name="files[]" multiple /> 4</div>

css

1input[type="file"] { 2 display: block; 3} 4.imageThumb { 5 max-height: 75px; 6 border: 2px solid; 7 padding: 1px; 8 cursor: pointer; 9} 10.pip { 11 display: inline-block; 12 margin: 10px 10px 0 0; 13} 14.remove { 15 display: block; 16 background: #444; 17 border: 1px solid black; 18 color: white; 19 text-align: center; 20 cursor: pointer; 21} 22.remove:hover { 23 background: white; 24 color: black; 25}

試したこと

on('click', function())に変えたり、return falseや$('input[type=file]').val('');によるクリアなどは試みましたがダメでした。

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

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

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

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

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

guest

回答2

0

for文の中で$(".remove").clickを指定しているのでforのループ回数だけ
イベントが追加されますね
inputタグがformに内在していないのでどこまで遡ればいいかわからづらいですが
.fieldの要素として処理してみてはどうでしょうか?

javascript

1<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script> 2<script> 3$(function(){ 4 if (window.File && window.FileList && window.FileReader) { 5 $("#files").on("change", function(e) { 6 var files = e.target.files, 7 filesLength = files.length; 8 for (var i = 0; i < filesLength; i++) { 9 var f = files[i]; 10 var fileReader = new FileReader(); 11 fileReader.onload = (function(e) { 12 var file = e.target; 13 $("<span class=\"pip\">" + 14 "<img class=\"imageThumb\" src=\"" + e.target.result + "\" title=\"" + file.name + "\"/>" + 15 "<br/><span class=\"remove\">Remove image</span>" + 16 "</span>").insertAfter("#files"); 17 }); 18 fileReader.readAsDataURL(f); 19 } 20 }).closest(".field").on('click','.remove',function(){ 21 $(this).parent(".pip").remove(); 22 }); 23 } else { 24 alert("Your browser doesn't support to File API") 25 } 26}); 27</script> 28 29<div class="field" align="left"> 30 <h3>Upload your images</h3> 31 <input type="file" id="files" name="files[]" multiple /> 32</div>

投稿2019/04/22 08:36

編集2019/04/22 08:38
yambejp

総合スコア114784

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

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

asr1919

2019/04/22 09:01 編集

素早い回答ありがとうございます。 数分の差ですが、早く回答してくださった方にベストアンサーを送らせていただきました。 申し訳ございません。 こちらの方法でも無事思った通りの処理ができました。
guest

0

ベストアンサー

下記部分を.removeではなく特定の要素に置き換えてしまいましょう。(複数ある場合全ての.removeにクリックイベントを付与してしまっているため)

js

1 $(".remove").click(function(){ 2 $(this).parent(".pip").remove(); 3 });

もしくはon("change"の外に出して、個別に設定するのを止めるかどちらかだと思います。

js

1$( 'body' ).on( 'click', '.remove', function() { 2 $(this).parent(".pip").remove(); 3} );

【【jQuery】onメソッドの使用方法 - Qiita】
https://qiita.com/katsunory/items/7b50d399329767a893e1#selectorでイベントデリゲート

【実践、jQuery - .on()と.off()を使いこなす 1 | CodeGrid】
https://app.codegrid.net/entry/practical-jquery-1

投稿2019/04/22 08:33

kei344

総合スコア69400

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

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

asr1919

2019/04/22 08:58

素早い回答ありがとうございます。 イベントの解説したサイトまで張っていただき、とても助かりました。 無事解決致しました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問