1

私はJSでこの問題を抱えています.JSは私の母国語ではありません. var divID = 0;一意の番号であるグローバル変数を宣言しました。私の HTML ページにはボタンがあり、クリックすると DOM にたくさんのものを追加します。

何かのようなもの:

function addStuff() {
  divID++;
  newDiv = document.createElement("div");
  newDiv.id = "div" + divID;
  // Create a bunch more nodes under newDiv
  // including some button with id: "newButton" + divID
  document.getElementById("someDiv").appendChild(newDiv);
  $("#newButton" + divID).click(function() {
    // do stuff with child nodes of "newDiv" + divID
  });
}

これが理にかなっていることを願っています。基本的に、 が呼び出されるたびaddStuff()に、もののブロックが DOM に追加されます。ユーザーがそれを繰り返しクリックすると、同じ内容が次々と追加されます。

追加されたものの各ブロックには、から来るいくつかの ID サフィックスがdivIDあり、ブロック内の特定の要素には、同じブロックの他の要素に影響を与えるイベントがあります。各ブロックは自己完結型である必要があります。

ただし、ユーザーがボタンを 2 回クリックして 2 つのブロック (ID サフィックス 1 を持つブロックと ID サフィックス 2 を持つブロック) を追加すると、両方のブロックのイベントが、最後に追加されたブロックの子要素に常に影響します。

では、10 個のブロックがあると想像してください。自己完結型である必要があるすべてのブロックのすべてのイベントは、それらが存在するブロックではなく、実際には最後のブロックに影響します。

ループ内のスレッドをスプールアップし、反復変数がスレッド本体で何らかの役割を果たすと、C# でこのようなことが起こることを私は知っています。

for (int i = 0; i < 10; i++) {
  new Thread(new ThreadStart(delegate() { Console.WriteLine(i); })).Start();
}

予期しない結果が生成されます。ただし、ほとんどの場合、0 から 9 ではなく 9 です。

for (int i = 0; i < 10; i++) {
  int j = i;
  new Thread(new ThreadStart(delegate() { Console.WriteLine(j); })).Start();
}

うまくいきます。

私は似たようなことを試しました。私のJavascriptコードでは、次のように書きました。

divID++;
localDivID = divID;

DOM 内のものをセットアップするときlocalDivIDの代わりに使用されます。divIDしかし、これはまったく効果がありませんでした。必要な ID サフィックスを持つ要素を参照することはまだできません。

4

1 に答える 1

3

ローカル変数を作成する必要があります。関数内で (キーワード
を使用して) 変数を宣言します。var

JavaScript にはブロック スコープがないことに注意してください。ループ内でこれを行うことはできません。

于 2012-11-27T04:17:01.090 に答える