- ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:JavaScript/CANVASでの画像読込不可)
JavaScript/CANVASで透過GIFファイルの表示エラーについて
このQ&Aのポイント
- JavaScript/CANVASで透過GIFファイルを表示しようとする際に、エラーが発生しております。エラーメッセージは「TypeError: this.ctx is undefined」と表示されており、このエラーの原因として、thisの使い方が間違っている可能性があります。
- また、drawPicture関数の修正を行うことでエラーが解消する場合もありますが、画像が表示されないケースもあります。この問題の解決策をご教示いただけると幸いです。
- JavaScriptの初心者として、JavaScript/CANVASで透過GIFファイルを正しく表示する方法を知りたいです。皆様のアドバイスをお待ちしております。
- みんなの回答 (1)
- 専門家の回答
質問者が選んだベストアンサー
関数内の this は、関数を実行する方法によって、指し示す値が異なります。 Container1.drawPicture(); と実行された場合、 関数 drawPicture 内の this は Container1 を指し示します。 img.onload がイベント発生時に呼び出されて実行される場合、 関数 onload 内の this は img を指し示します。 というわけで、関数 onload にて実行する this.ctx は、 Container1.ctx ではなく img.ctx と解釈され、 その様なプロパティが存在しないエラーが発生します。 対処方法はいろいろありますが、二つほど例示します // this の値を変数 that に格納して onload から参照する var that = this; that.img.onload = function(){ that.ctx.drawImage(...) }; // this を束縛した関数を onload として使用する var handler = function(){ this.ctx.drawImage(...) }; this.img.onload = handler.bind(this);
お礼
ありがとうございます! 頂いた例の上のものを使用してうまくいきました。 (下はbindという見慣れない単語があり、ちょっと今回は理解できそうで似なかったので・・・) 結局、drawPicture関数は以下のようにし、onloadの下は すべてthatに置き換えることによりうまくいきました。 Picture.prototype.drawPicture = function(){ var that = this; that.img.onload = function(){ that.ctx.drawImage(that.img, that.locX, that.locY, that.width, that.height); } } どうもありがとうございました! 以上