元素id为的Javascript局部变量

元素id为的Javascript局部变量,javascript,javascript-events,Javascript,Javascript Events,我在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

我在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中添加一块stuff。如果用户反复单击,相同的、相同的内容会一次又一次地添加

添加的每个数据块都有一些来自
divID
的ID后缀,并且块中的某些元素具有影响同一块中其他元素的事件。每个模块都应该是独立的

但是,当用户单击按钮两次以添加两个块(一个ID后缀为1,一个ID后缀为2)时,两个块的事件始终会影响最近添加的块的子元素

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

我知道在C#中会发生这种情况,当我在循环中启动线程时,迭代变量在线程体中起着某种作用:

for (int i = 0; i < 10; i++) {
  new Thread(new ThreadStart(delegate() { Console.WriteLine(i); })).Start();
}
并在DOM中设置内容时使用
localDivID
而不是
divID
。但这绝对没有效果。我仍然无法引用具有所需ID后缀的元素。

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


注意Javascript没有块作用域;你不能在循环中完成这项工作。

你可以通过对所有内容使用jQuery来缩短代码。@ahren我显然没有正确解释它。@SLaks当然可以,但我必须在明天之前完成这项工作,我对jQuery的了解甚至比我对JS的了解还要少。这很有效。因此,如果我在JS中声明一个函数内部的变量而不使用
var
,它将自动成为全局变量?@jfriend00感谢您的帮助-但您似乎不仅仅是在帮助,而是在混淆事情。我有两个变量-
divID
,它应该是全局的,以确保每个块都是唯一的;
localDivID
,它应该是局部的,以确保每个块只影响自身。问题是我在
localDivID
前面缺少
var
,这使它成为另一个全局变量。问题已经解决了。谢谢你的沙拉。
for (int i = 0; i < 10; i++) {
  int j = i;
  new Thread(new ThreadStart(delegate() { Console.WriteLine(j); })).Start();
}
divID++;
localDivID = divID;