1

我在 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,并且块中的某些元素具有影响同一块的其他元素的事件。每个块都应该是独立的。

但是,当用户单击按钮两次以添加两个块 - 一个具有 ID 后缀 1 和一个具有 ID 后缀 2 时,两个块的事件总是会影响最近添加的块的子元素。

所以想象一下我有 10 块东西。应该独立的所有块的所有事件实际上影响最后一个块,而不是它们所在的块。

我知道当我在一个循环中处理线程并且迭代变量在线程主体中扮演一些角色时,在 C# 中会发生这种事情:

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

会产生意想不到的结果 - 大多数是 9 而不是 0 到 9,但是:

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

会正常工作。

我尝试了类似的东西。在我的 Javascript 代码中,我写道:

divID++;
localDivID = divID;

localDivID不是divID在 DOM 中设置内容时使用。但这完全没有效果。我仍然无法引用带有我想要的 ID 后缀的元素。

4

1 回答 1

3

您需要创建一个局部变量。
在函数内声明变量(使用var关键字)。

请注意,Javascript 没有块作用域;您不能在循环中执行此操作。

于 2012-11-27T04:17:01.090 回答