2012-04-18 11 views
0

HTML:文字列をcanvas要素で使用するDOM要素に変換するにはどうすればよいですか?

<img src="person.png" id="person"/> 

はJavaScript:

var object0 = document.getElementById("person"); 
var i = 0; 

context.drawImage(object0, object0X, object0Y);// this works 

context.drawImage("object" + i, object0X, object0Y);// this doesn't 

エラーメッセージ:私はエラーが出る理由は、それはDOM要素でなければならないことであることをどこかで読ん

Could not convert JavaScript argument arg 0 [nsIDOMCanvasRenderingContext2D.drawImage] 

、文字列ではありません。さて、私はforループを実行する必要があるので、私は画面上のいくつかのオブジェクトに影響を与えることができ、したがっていくつかの連結を行う必要があります。私が使用できるparseInt()に類似したものがありますか?

私はあなたがやりたいと思う

答えて

2

文字列リテラルを使用して変数を参照すると、文字列リテラルに評価されるため、エラーが発生します。

var Object0 = document.getElementById('person'); // typeof 'object' 
console.log(typeof ('Object' + i)); // This will output 'string' to the console 

代わりに、プロパティがDOM要素への参照を保持するオブジェクトを作成できます。

var images = { 
    Object0: document.getElementById('person') 
    // and so forth... 
}; 

これは、ブラケット表記を使用して各プロパティを参照できるため、非常に便利です。これで、forループを使用してプロパティをループし、値にアクセスできます。 OPは既に "object0"ではない明示的なIDを持っていないことを見ていないため、

for (var i = 0; i < images.length; i++) { 
    context.drawImage(images['Object' + i], Object0X, Object0Y); // This works 
    console.log(typeof images['Object' + i]); // This will output 'object' to the console 
} 
+0

+1が正確です。この場合、配列の代わりに名前付きプロパティを持つオブジェクトを使う必要はないことに注意してください: 'var images = []; images [0] = document.querySelector( '#person'); for(...){ctx.drawImage(images [i]、...); } ' – Phrogz

+0

@Phrogz非常に真実です。最も簡単な解決策が私を逃すことがあります。 –

+0

FWIW、誰かがローカル変数を動的に調べようとしているときに、それらをオブジェクトの名前付きエントリとして保存するという提案はデフォルトの最初の答えですので、完全に理解できます。 – Phrogz

0

あなたがIDS object0と画像要素、 object1object2を持っていることを必要とするであろう

context.drawImage(document.getElementById("object" + i), object0X, object0Y);

...

+0

-1です。 – Phrogz

+0

私はそれを見ました。彼は他のイメージオブジェクトも持っていて、それらを取得したいと思っていましたが、単純に文字列を連結してgetElementByIdで使用する方法はわかりませんでした。 –

0

あなたはJS変数を参照することはできません文字列を介して。このエラーは、イメージへの参照ではなく、文字列をdrawImage関数に渡すことに起因します。関数に変数を渡すだけで動作します。

+0

正解ですが、この回答は、実際に参照を動的に作成しようとしているOPを実際には助けません。 – Phrogz

+1

私はこれがPHPのような変数渡しのような印象を受けました。しかし、少なくとも私は 'eval'を使用してこれまで提案してくれたことがないのでうれしいです... – fb55