元素id为的Javascript局部变量
我在JS中遇到了这个问题——JS根本不是我的母语。我已经声明了一个全局变量元素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
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;