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

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

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

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

Q&A

解決済

1回答

1231閲覧

javascriptのquerySelectorAllにクリックイベントを付与したいが、回数がおかしい

kihokutarou

総合スコア59

JavaScript

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

0グッド

2クリップ

投稿2022/01/24 12:52

バニラでのコーディングを勉強中です。
読み込んだ画像に対してaddEventListenerで「クリックしたらcanvasに描画」を記述したいと思っています。canvasにはfabricを使っていますが、今回の質問には関連しないと思います。

javascript

1document.getElementById( "target" ).addEventListener( "change", function() { 2 var fileList = this.files ; 3 var num = 100; 4 for( var i=0,l=fileList.length; l>i; i++ ) { 5 var blobUrl = window.URL.createObjectURL( fileList[i] ) ; 6 7 document.getElementById('Hikidasi').insertAdjacentHTML('beforeend','<img id="' + i + '" class="Htool" src="' + blobUrl + '" style="width:5vw">'); 8 document.querySelectorAll('.Htool').forEach(function(cards){ 9 cards.addEventListener('click',function(){ 10 console.log(cards.src); 11 fabric.Image.fromURL(cards.src, function(oImg) { 12 oImg.scaleToWidth(Can.width*0.1); 13 oImg.set('left', Can.width*0.3); 14 oImg.set('top', Can.height*0.3); 15 Can.add(oImg); 16 }); 17 }); 18 }); 19 } 20 });

目的通り読み込んだ画像をクリックでcanvasへの描画はできましたが、forEachで回しているからだと思いますが、1個目の画像は1回、6個目の画像は6回分Can.add(oImg)されてしまいます。
querySelectorAllへのイベントなのでforEachを使っていますが、これが原因だと思いますが、解決策がわかりません。
すべて1回の描画に収めるのはどのようにすればよいでしょうか。

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

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

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

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

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

guest

回答1

0

ベストアンサー

insertAdjacentHTML() で挿入した最後の <img> にだけ処理をすればよいのだと思います。

js

1let hikidasi = document.getElementById('Hikidasi'); 2hikidasi.insertAdjacentHTML('beforeend', 3 `<img id="${i}" class="Htool" src="${blobUrl}" style="width:5vw">`); 4hikidasi.lastChild.addEventListener('click', function() {

または、ループを分ける。

js

1for (var i = 0, l = fileList.length; l > i; i++) { 2 var blobUrl = window.URL.createObjectURL(fileList[i]); 3 document.getElementById('Hikidasi').insertAdjacentHTML( 4 'beforeend', `<img id="${i}" class="Htool" src="${blobUrl}" style="width:5vw">`); 5} 6document.querySelectorAll('.Htool').forEach(function(cards) { 7 cards.addEventListener('click', function() { 8 ... 9 }); 10});

投稿2022/01/24 13:19

編集2022/01/24 13:27
int32_t

総合スコア20790

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

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

kihokutarou

2022/01/24 13:41

ループを分ける、でとてもすっきりしました。 単純なことでしたが本当にとても勉強になります。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問