質問するログイン新規登録
JavaScript

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

Q&A

解決済

1回答

480閲覧

JavaScript 「Uncaught (in promise) TypeError」の対処方法を教えて頂けないでしょうか。

taka_oct092018

総合スコア144

JavaScript

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

1グッド

2クリップ

投稿2024/11/29 14:59

編集2024/11/29 15:02

1

2

実現したいこと

デバッグあるいはエラーの原因の特定方法を教えて頂けないでしょうか。
https://upload0605.web.fc2.com/sample_nov292024/idx.html

発生している問題・分からないこと

オセロゲームでの画像が一部表示されない。

エラーメッセージ

error

1 Uncaught (in promise) TypeError: CanvasRenderingContext2D.drawImage: Argument 1 could not be converted to any of: HTMLImageElement, SVGImageElement, HTMLCanvasElement, HTMLVideoElement, OffscreenCanvas, ImageBitmap, VideoFrame. 2 draw https://upload0605.web.fc2.com/sample_nov292024/js/resource-img.js:47 3 drawToken https://upload0605.web.fc2.com/sample_nov292024/js/app-view.js:107 4 scanBoard https://upload0605.web.fc2.com/sample_nov292024/js/reversi-low.js:24 5 drawToken https://upload0605.web.fc2.com/sample_nov292024/js/app-view.js:88 6 <anonymous> https://upload0605.web.fc2.com/sample_nov292024/js/main.js:11 7resource-img.js:47:6

該当のソースコード

// main.js 'use strict'; document.addEventListener( 'DOMContentLoaded', async () => { reversiCore.init(); await appResource.load(); appView.init(); appView.drawToken(); appView.drawCanPut(); } );
// resource-img.js 'use strict'; /* * variable : * 1. resourceImg: { Object } リソース 画像の名前空間 * 2. holder : { Object } img要素オブジェクトを格納するオブジェクト */ const resourceImg = { holder: {} }; /* * description: 画像ファイルを読み込む関数 * id : { String } id名 * url : { String } 画像のurl * returns : { Promise } プロミスオブジェクト */ resourceImg.load = function({ id, url }) { return new Promise( resolve => { // img: { Object } img要素を表すオブジェクト const img = new Image(); img.onload = resolve; // 読み込み後の処理 img.src = url; // URLを指定 this.holder[ id ] = img; } ); }; // resourceImg.load = function({ id, url }) {} /* * description: 画像を描画する関数 * id : { String } id名 * cobj : { Object } キャンバスのオブジェクト * x : { Number } 画像の水平位置 * y : { Number } 画像の鉛直位置 * w : { Number } 画像の横幅 * h : { Number } 画像の高さ * returns : no return values */ resourceImg.draw = function({ id, cobj, x, y, w, h }) { cobj .ctx .drawImage(this.holder[ id ], x, y, w, h); // エラーが発生する箇所 @@@@@@@@@@@@@@@@ };

試したこと・調べたこと

  • teratailやGoogle等で検索した
  • ソースコードを自分なりに変更した
  • 知人に聞いた
  • その他
上記の詳細・結果

(検証1)

JavaScript

1document.addEventListener( 2 'DOMContentLoaded', 3 async () => { 4 try { 5 reversiCore.init(); 6 await appResource.load(); 7 appView.init(); 8 appView.drawToken(); 9 appView.drawCanPut(); 10 } catch (err) { 11 console.log(`エラー発生: ${ err.message }`); 12 } 13 } 14);

21:54:09.916 エラー発生: CanvasRenderingContext2D.drawImage:
Argument 1 could not be converted to any of: HTMLImageElement,
SVGImageElement, HTMLCanvasElement, HTMLVideoElement,
OffscreenCanvas, ImageBitmap, VideoFrame. main.js:25:15

(検証2)

JavaScript

1appResource.load = async function() { 2 3 // promises: { Array } プロミスインスタンスを格納する配列 4 const promises = []; 5 6 7 promises.push( resourceImg.load({ id: 'token0', url: 'img/token_0.png' }) ); 8 promises.push( resourceImg.load({ id: 'token1', url: 'img/token_1.png' }) ); 9 promises.push( resourceImg.load({ id: 'square', url: 'img/square.png' }) ); 10 promises.push( resourceImg.load({ id: 'active', url: 'img/active.png' }) ); 11 await Promise 12 .all(promises) 13 .then( res => console.log(res) ) 14 .catch( err => console.log(`エラー: ${ err }`) ); 15};

エラーは検出されず。

補足

特になし

juner👍を押しています

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

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

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

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

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

guest

回答1

0

ベストアンサー

エラーメッセージに従い、まずは怪しそうな内容を具体的に確認することをオススメします。

ざっくり解説

エラーメッセージは要約すると「canvas 2D の drawImage 関数の第1引数が、描画可能なモノではない」という感じの TypeError だと主張しています。
問題のdrawImage関数はスタックトレースの一番上にあるとおり resource-img.js ファイルの 47 行目で呼び出しています。
draw https://upload0605.web.fc2.com/sample_nov292024/js/resource-img.js:47

その第1引数 this.holder[ id ] が、本当に描画可能なモノ(HTMLImageElement等の想定した画像データetc)かどうかを確認してみればよいでしょう。

具体的な確認方法

確認方法としては、ブラウザの開発者ツールのブレークポイントなどを使ってデバッグ実行して止めてみても良いですし

お手軽に問題箇所であるdrawImage関数呼び出しの直前(当該ファイル 45 行目とか)に
console.log(id, this.holder[ id ]);
のようなデバッグ出力を仕込んでみても良いでしょう。

投稿2024/11/29 21:57

pecmm

総合スコア762

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

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

taka_oct092018

2024/12/17 09:20

pecmm様 返信が遅れてしまい申し訳ありません。 アドバイス通り繰り返しデバッグを行った所、複数の問題箇所を突き止めて修正できました。 ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.30%

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

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

質問する

関連した質問