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

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

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

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

JavaScript

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

jQuery

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

CSS

CSSはXMLやHTMLで表現した色・レイアウト・フォントなどの要素を指示する仕様の1つです。

Q&A

解決済

1回答

1946閲覧

canvasで絵画機能を動的に生成したい

MikMik

総合スコア46

canvas

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

JavaScript

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

jQuery

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

CSS

CSSはXMLやHTMLで表現した色・レイアウト・フォントなどの要素を指示する仕様の1つです。

0グッド

0クリップ

投稿2018/08/25 04:45

JSで絵画機能を自由に複製できるようにしたいです。
現在ajaxからテンプレートHTMLを読み込んで絵画のHTMLが存在していれば(canvasのタグがあれば)お絵かきができるようにしたいです。

javascript

1$(document).on("change", "[id=templates_number]", function(){ 23 $.post("templates.php", { 4 data : template_data, 56 }, function(data) { 7 //dataにhtmlを入れて読み込んでいる 8  略 9 //タグがcanvasならcanvasのセッティング 10  canvas = document.getElementById("canvasタグのid"); 11 ctx = canvas.getContext('2d'); 12 undoImages = []; 13 pointer = -1; 14 canvas.addEventListener('mousemove', draw_canvas); 15  略 16 }); 17});

かなりコードを省略して申し訳ないです。フォームのデータ情報をjsonで読み込んでおり、それをループさせてタグのタイプがcanvasだったらそのキャンバスの設定をしたいです。
現在このような形になっています。恐らくこのままだと複数の設定ができないと思います。また、EventListenerはループの中で設定できるのか怪しいです。
JSの経験がまだ浅いので皆様の助言をお待ちしております

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

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

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

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

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

guest

回答1

0

ベストアンサー

脱初心者レベルの難しい話になります。
もし理解するのが難しければJavaScriptで新しく変数を利用するときはvar(またはlet)を使うことだけ覚えてもらえればよいです。
コードの修正点としてはループ中の変数をlet宣言に直すのと、draw_canvas()関数をループ中で定義するようにすればよいかと思います。

質問文のコードが複数の<canvas>に対応できないのは、ループ中で使用している変数が「グローバル変数」になっているからであると考えられます。このままでは2回目以降の<canvas>タグで前回の値を上書きしてしまいます。
JavaScriptでは新しく変数を使用する際にvarletを用いて変数を宣言するとその変数は「ローカル変数」となり、変数の使用できる範囲を限定して使用することができます。
文法とデータ型 - JavaScript | MDN

質問文のコードを下記のように書き換えることで、変数をローカル変数として使用し、ループによる上書きを回避できると思います。

javascript

1let canvas = document.getElementById("canvasタグのid"); 2let ctx = canvas.getContext('2d'); 3let undoImages = []; 4let pointer = -1;

ここで用いたletというのは、forループなどに用いる{ }←この括弧の中だけで使用できる変数を宣言しています。こうすることによって、forループがループされるたびに新しい変数が生成されることになります。
(forループ1回目の変数canvasとループ2回目の変数canvasは別物ということになります。)

注意点として、addEventListener()について、引数に与える関数draw_canvas()forループの{ }の中で定義する必要があります。なぜなら変数canvas{ }の中にしか存在しないからです。
また、関数の中から外へ参照する変数は、関数を定義した時点でのローカル変数になるので、変数canvasはちゃんとループごとの変数になってくれます。

投稿2018/08/25 08:26

reosablo

総合スコア339

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

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

MikMik

2018/08/26 01:24

丁寧にご説明いただきありがとうございます! ループ中にvarやletで定義したものは別物になるとは初めて知りました。勉強になります。おかげ様で複数のcanvasを設定できるようになりました。
reosablo

2018/08/26 04:34

勉強になってもらえたようでよかったです。 補足しておくと、letは波括弧{ }で別物になりますが、varは関数function(){ }で別物になります。(varは波括弧{ }では別物にはならないので、1つの変数をループのたびに上書きすることになってしまいます。) 似てるようで違うので、詳しくは調べてみるとよいでしょう。
reosablo

2018/08/26 04:48

補足の補足失礼します…。 letはvarの代わりになりますが、varをletの代わりにするのはちょっと手間がかかります。もし古いIEを動作対象外にするのであればvarは使わずすべてletにするのがよいかと思います。 https://caniuse.com/#feat=let
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問