🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
canvas

HTML5の<canvas>要素用のタグです。CanvasはHTML5から導入された、二次元の図形描写が可能な要素です。

JavaScript

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

Q&A

解決済

2回答

1057閲覧

javascript(canvas)でダブルクリックイベントのfor文がうまく回らない

Izumo1101

総合スコア49

canvas

HTML5の<canvas>要素用のタグです。CanvasはHTML5から導入された、二次元の図形描写が可能な要素です。

JavaScript

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

0グッド

0クリップ

投稿2021/02/15 12:00

全コードは長いので割愛します。
ユーザーが任意に画像を選び、それをcanvas上に描画しています。その際、
images[j].drawOffsetX = x;
のようにその画像の座標をプロパティに入れています。描画する画像はimagesという配列に突っ込んでいる状態です。

画像をダブルクリックで消去するコードを書きたいのですが、どうもfor文がうまく回っていません。最終画像をダブルクリックするとうまく消去できますが、それ以外だと次の連番の画像も消えてしまい、「は残す」のコンソールにも吐かないことから、for文に問題があるように思えます。

javascript

1//ダブルクリック時消去 2 const mouseDBclick = function(e){ 3 console.log(dragTarget); 4 context.clearRect(0, 0, canvas.width, canvas.height); 5 let MaxImg = images.length; 6 console.log("画像最大数は" + MaxImg); 7 8 for(let i=0; i < MaxImg+1; i++){ 9 if (i == Number(dragTarget)) { 10 images.splice(i,1); 11 console.log(dragTarget + "は消す"); 12 MaxImg =-1; 13 } else { 14 x = images[i].drawOffsetX; 15 y = images[i].drawOffsetY; 16 w = images[i].drawWidth; 17 h = images[i].drawHeight; 18 context.drawImage(images[i], x, y, w, h); 19 console.log(i + "は残す"); 20 } 21 } 22 } 23canvas.addEventListener('dblclick', function(e){mouseDBclick(e);}, false);

canvasの技術的な問題ではなくjavascriptの基本構文の問題のような気がしますが、ご指摘願えないでしょうか。

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

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

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

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

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

babu_babu_baboo

2021/02/15 12:42 編集

for(let i=0; i < MaxImg+1; i++){... MaxImg に1つ足すのは余計。 削除した時にカウンタの変数 i は、カウントしてはいけない。
guest

回答2

0

自己解決

javascript

1for(let i=0; i < MaxImg; i++){ 2 if (i == Number(dragTarget)) { 3 // images.splice(i,1); 4 // 00位置に00大きさで描画して配列からは除外しない 5 context.drawImage(images[i], 0, 0, 0, 0); 6 images[i].drawOffsetX = 0; 7 images[i].drawOffsetY = 0; 8 images[i].drawWidth = 0; 9 images[i].drawHeight = 0; 10 } else { 11 x = images[i].drawOffsetX; 12 y = images[i].drawOffsetY; 13 w = images[i].drawWidth; 14 h = images[i].drawHeight; 15 context.drawImage(images[i], x, y, w, h); 16 } 17 }

配列から除外せずに0描画する方法で見た目上の削除を果たしました。
ご助言いただいた方、ありがとうございました。

投稿2021/02/17 02:08

Izumo1101

総合スコア49

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

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

0

2点、ご自身が把握されているか、です。
if文の条件は適切か。
forループを終了条件が適切か。

”残す”のコンソールログが表示されないということは、次のif文が常に成立している、ということになります。これらの値が意図通りになっているかログで確認してみましょう。
if (i == Number(dragTarget)) {

またforループの終了条件をループごとに -1 する必要があるのかが、実装がわからないので、なんとも言えませんが、分かりにくい処理になっているな、とは見受けられます。
MaxImg =-1;

特殊な条件かもしれませんが、問題点の整理に役立てば幸いです。

投稿2021/02/16 04:33

編集2021/02/16 04:34
phoepsilonix

総合スコア233

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問