良い一日!コンストラクターに適用されるJavascriptの動的変数名について助けを求めるためにここにいます。予想以上に大変でした。私は多くのフォーラムやウェブページでこの問題について読んだことがありますが、私が間違っていることを見つけることができません= /
私はEaselJSと呼ばれるHTML5+Javascriptライブラリを使用していますが、私の問題はそれに関連しているのではなく、Javascript構文に関連しています!これが私の問題です。私はこのコードを手に入れました:
stage1 = new Stage(document.getElementById("cnvs1"));
stage2 = new Stage(document.getElementById("cnvs2"));
stage3 = new Stage(document.getElementById("cnvs3"));
ここで、変数stageは、canvas id cnvsで初期化されるStageオブジェクトを割り当てています。この行(私のコードの残りの部分のコンテキストでは)は機能します!これを次のようなforを使用して1行に簡略化したいと思います。
for(i = 0; i < 5; i++){
//Of course this is wrong!
stage[i] = new Stage(document.getElementById("cnvs[i]"));
}
ここにあるこのリンクは、これがどのように行われるかを再開します:eval(多くの人がそれは推奨されないと言う)とwindow(推奨)を使ってこれを行うと(for
さらに単純化することなく):
var varname = "stage";
var i = 1;
window[varname + i] = new Stage(document.getElementById("cnvs_terminal1"));
コードは引き続き機能します。しかし、引用符で囲まれたキャンバスIDを使用して同様のソリューションを実現する方法を理解することはできません。これらのコード行は失敗します:
var i = 1;
var varname = "stage";
var varname2 = 'cnvs1';
var varname3 = "\"cnvs1\"";
var varname4 = "\"cnvs1" + i + "\"";
window[varname +i] = new Stage(document.getElementById(window[varname2]));
window[varname +i] = new Stage(document.getElementById(window[varname3]));
window[varname +i] = new Stage(document.getElementById(window[varname4]));
これらの試みでは、私が必要とする正確な値を( iなしで)渡そうとしても、それは私を助けていません!! getElementbyId
=(=(=()に必要だと思うので、引用符をバックスラッシュしています
今、私は無知です!=(これを行う方法があると確信しています。構文がわからない、参照または値によって変数を適切に呼び出す方法がわからない、わからない...助けてください私、この簡単な作業の仕方がわかりません!
たくさんありがとう=)
編集: @cHaoの提案を試してみても私もできません!シンプルに保つために、foriを1つだけに設定しました。
for (var i = 1; i <= 1; ++i) {
//I use only one of the following lines at a time of course, but I'll write here my failing tries all together:
stage[i] = new Stage(document.getElementById('cnvs'+i));
stage[i-1] = new Stage(document.getElementById('cnvs'+i));
//Hardcoding the first variable works!
stage1 = new Stage(document.getElementById('cnvs'+i));
}
問題の半分は解決しましたが、最初の変数をどうするか?=/ありがとう!!!!
編集2: 詳細が要求されました!これがコピー/貼り付けの例です!これが機能するように、EaselJSと画像パスを更新するだけです!
<!DOCTYPE HTML>
<html>
<head>
<script src="easeljs-0.4.0-26/lib/easel.js"></script>
<script type="text/javascript">
function init() {
//MY PROBLEM LIES HERE!!
for (var i = 1; i <= 1; ++i) {
//This code WORKS
stage1 = new Stage(document.getElementById('cnvs'+i));
//This code DOES NOT WORKS
//stage[i] = new Stage(document.getElementById('cnvs'+i));
//stage[i-1] = new Stage(document.getElementById('cnvs'+i));
}
var images = "images/itzapic.jpg";
bitmap = new Bitmap(images);
stage1.addChild(bitmap);
stage1.update();
Ticker.addListener(window);
}
function tick() {
stage1.update();
}
</script>
</head>
<body onload="init()">
<canvas id="cnvs1" width="140" height="82">
</body>
</html>
__ _ __ _ __ _ __ _ __ _ __ _ __ _ __ _ __ _ __ _ __ _ __ _ __ _ __ _ _
編集3:解決しました! EaselJSを使用して、同じオブジェクトで必要な数のキャンバスに1つの画像をレンダリングしたい人を参照するために、最終的なコードを投稿します。このためには、ステージ用のbitmap.clone()メソッドと配列が必要です。私を助けてくれた@cHaoに感謝します;)次のコードはすべてのキャンバスで同じ画像をレンダリングします!必要に応じて更新してください;)
<!DOCTYPE HTML>
<html>
<head>
<script src="easeljs-0.4.0-26/lib/easel.js"></script>
<script type="text/javascript">
stage = [];
function init() {
for (var i = 1; i <= 6; ++i) {
stage[i-1] = new Stage(document.getElementById('cnvs'+i));
}
var images = "images/itzapic.jpg";
bitmap = new Bitmap(images);
stage[0].addChild(bitmap);
for (var i = 1; i <= 5; ++i) {
stage[i].addChild(bitmap.clone());
}
stage[0].update();
Ticker.addListener(window);
}
function tick() {
for (var i = 0; i < stage.length; ++i) {
stage[i].update();
}
}
</script>
</head>
<body onload="init()">
<canvas id="cnvs1" width="140" height="82"></canvas>
<canvas id="cnvs2" width="140" height="82"></canvas>
<canvas id="cnvs3" width="140" height="82"></canvas>
<canvas id="cnvs4" width="140" height="82"></canvas>
<canvas id="cnvs5" width="140" height="82"></canvas>
<canvas id="cnvs6" width="140" height="82"></canvas>
</body>
</html>