変数割り当てでCanvasRenderingContext2Dメソッドを使用できません

たなき

私は、キャンバスを使用して、HTML / JavaScript Canvas APIを使用して、ストロークや塗りつぶされた長方形を多数描画するWebアプリに取り組んでいます。ストロークされた長方形と塗りつぶされた長方形の両方にまったく同じ座標を使用する必要があるため、現在の描画関数(ctx.strokeRectまたはのいずれctx.fillRect)を変数に割り当てて、後で呼び出します。

残念ながら、CanvasRenderingContext2D関数を保持している変数を使用しようとすると、エラーがスローされます'fillRect' called on an object that does not implement interface CanvasRenderingContext2D

これは私がやろうとしていることの単純化されたバージョンであり、2番目の長方形の描画中にエラーをスローします。

const canvas = document.getElementById('canvas');
const ctx = canvas.getContext('2d');
// draw the top rectangle - works fine
ctx.fillRect(0, 0, 100, 50);
// draw the bottom rectangle - crashes with an error
(f => f(0, 50, 100, 50))(ctx.fillRect);
<canvas id="canvas" width="100" height="100"></canvas>

メソッドが次のような変数に割り当てられている場合も、エラーがスローされます。

const fn = ctx.fillRect;
fn(0, 0, 50, 50);

キャンバスコンテキスト関数をこのように使用できないのはなぜですか?または、このように使用できますか?コードに間違いがありませんか?

海道

これらのメソッドはCanvasRenderingContext2Dプロトタイプから継承されており、そのようなコンテキストのすべてのインスタンスでまったく同じ関数であるためです。

const canvas1 = document.createElement("canvas");
const canvas2 = document.createElement("canvas");
const ctx1 = canvas1.getContext("2d");
const ctx2 = canvas2.getContext("2d");
const fn1 = ctx1.fillRect;
const fn2 = ctx2.fillRect;

console.log( "fn1 === fn2:", fn1 === fn2 );
console.log( "fn1 === proto.fillRect:", fn1 === CanvasRenderingContext2D.prototype.fillRect );

必要なのは、コンテキストの特定のインスタンスにバインドされたこの関数のコピーを作成することです

const canvas = document.getElementById('canvas');
const ctx = canvas.getContext('2d');
// draw the top rectangle - works fine
ctx.fillRect(0, 0, 100, 50);
ctx.fillStyle = "green";
(f => f(0, 50, 100, 50))(ctx.fillRect.bind(ctx));
<canvas id="canvas" width="100" height="100"></canvas>

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

タイプ 'CanvasRenderingContext2D | WebGLRenderingContext 'はタイプ' CanvasRenderingContext2D 'に割り当てることができません

分類Dev

キャッチされないTypeMismatchError:「CanvasRenderingContext2D」で「drawImage」を実行できませんでした

分類Dev

Angular 2のsubscribe()メソッドを使用して変数に値を割り当てることはできません

分類Dev

変数phpにメソッドを割り当てることができません

分類Dev

変数はサブスクライブ メソッドから割り当てることができません

分類Dev

静的変数のメソッドを使用できません

分類Dev

IDataReaderのGetDateTimeメソッドを使用して日付を割り当てることはできません

分類Dev

jQuery変数でメソッドを使用することはできません

分類Dev

「TypeError:「CanvasRenderingContext2D」で「drawImage」を実行できませんでした」を修正するにはどうすればよいですか?

分類Dev

クラスメソッドを介して文字列値を割り当てることはできません

分類Dev

インスタンス変数に値を割り当てるAsynctaskonPostExecutiveメソッドですが、mainActivityクラスでは表示されていません。

分類Dev

Javaのシングルトンパターンについて、メソッドで静的変数を新しいローカル変数に割り当てる代わりに、直接静的変数を使用してみませんか?

分類Dev

値型を返すメソッドをFunc <dynamic>に割り当てることはできません

分類Dev

form_validメソッドでフィールドを割り当てることができません。null制約ではありませんエラー

分類Dev

CanvasRenderingContext2DをCanvasRenderingContext2Dにする理由は何ですか?

分類Dev

JQuery-DataTables-初期化中にon()メソッドを割り当てることができません

分類Dev

構造体のメソッドにプロパティを割り当てることができません

分類Dev

メソッドC#で変数を変更できません

分類Dev

メソッドのパラメーターを介して変数を変更できません

分類Dev

引数タイプ「文字列」をパラメータタイプ「Uint8List」/ FlutterのpostUrlメソッドに割り当てることはできません

分類Dev

サブクラスにグローバル変数を割り当て、onCreateメソッドで使用します-Android

分類Dev

継承、純粋仮想メソッドを使用して抽象型のオブジェクトを割り当てることはできません

分類Dev

クラスのメソッドによって遅延割り当てされた不揮発性変数を別のスレッドで読み取ることはできませんか?

分類Dev

onClickメソッド内の変数を変更できません

分類Dev

複数の引数でexecutescriptseleniumメソッドを使用できません

分類Dev

必須の位置引数が1つありません:変数にメソッドを割り当てるときに「self」

分類Dev

変数が初期化されていません。Void メソッドは値を返すことができず、変数に解決できません

分類Dev

割り当て後にlunrインデックスにドキュメントを追加できません(TypeError:idx.addは関数ではありません)

分類Dev

メソッドグループであるため、GetDropDownValuesに割り当てることができませんか?

Related 関連記事

  1. 1

    タイプ 'CanvasRenderingContext2D | WebGLRenderingContext 'はタイプ' CanvasRenderingContext2D 'に割り当てることができません

  2. 2

    キャッチされないTypeMismatchError:「CanvasRenderingContext2D」で「drawImage」を実行できませんでした

  3. 3

    Angular 2のsubscribe()メソッドを使用して変数に値を割り当てることはできません

  4. 4

    変数phpにメソッドを割り当てることができません

  5. 5

    変数はサブスクライブ メソッドから割り当てることができません

  6. 6

    静的変数のメソッドを使用できません

  7. 7

    IDataReaderのGetDateTimeメソッドを使用して日付を割り当てることはできません

  8. 8

    jQuery変数でメソッドを使用することはできません

  9. 9

    「TypeError:「CanvasRenderingContext2D」で「drawImage」を実行できませんでした」を修正するにはどうすればよいですか?

  10. 10

    クラスメソッドを介して文字列値を割り当てることはできません

  11. 11

    インスタンス変数に値を割り当てるAsynctaskonPostExecutiveメソッドですが、mainActivityクラスでは表示されていません。

  12. 12

    Javaのシングルトンパターンについて、メソッドで静的変数を新しいローカル変数に割り当てる代わりに、直接静的変数を使用してみませんか?

  13. 13

    値型を返すメソッドをFunc <dynamic>に割り当てることはできません

  14. 14

    form_validメソッドでフィールドを割り当てることができません。null制約ではありませんエラー

  15. 15

    CanvasRenderingContext2DをCanvasRenderingContext2Dにする理由は何ですか?

  16. 16

    JQuery-DataTables-初期化中にon()メソッドを割り当てることができません

  17. 17

    構造体のメソッドにプロパティを割り当てることができません

  18. 18

    メソッドC#で変数を変更できません

  19. 19

    メソッドのパラメーターを介して変数を変更できません

  20. 20

    引数タイプ「文字列」をパラメータタイプ「Uint8List」/ FlutterのpostUrlメソッドに割り当てることはできません

  21. 21

    サブクラスにグローバル変数を割り当て、onCreateメソッドで使用します-Android

  22. 22

    継承、純粋仮想メソッドを使用して抽象型のオブジェクトを割り当てることはできません

  23. 23

    クラスのメソッドによって遅延割り当てされた不揮発性変数を別のスレッドで読み取ることはできませんか?

  24. 24

    onClickメソッド内の変数を変更できません

  25. 25

    複数の引数でexecutescriptseleniumメソッドを使用できません

  26. 26

    必須の位置引数が1つありません:変数にメソッドを割り当てるときに「self」

  27. 27

    変数が初期化されていません。Void メソッドは値を返すことができず、変数に解決できません

  28. 28

    割り当て後にlunrインデックスにドキュメントを追加できません(TypeError:idx.addは関数ではありません)

  29. 29

    メソッドグループであるため、GetDropDownValuesに割り当てることができませんか?

ホットタグ

アーカイブ