我在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添加一块内容。如果用户反复点击它,则会一个接一个地添加相同的相同内容。
添加的每个块都有一些来自divID
的ID后缀,并且块中的某些元素具有影响同一块的其他元素的事件。每个区块应该是独立的。
但是,当用户单击按钮两次时,要添加两个块 - 一个具有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;
在设置DOM中的内容时使用localDivID
代替divID
。但这绝对没有效果。我仍然无法使用我想要的ID后缀引用元素。
答案 0 :(得分:3)
您需要创建本地变量
在函数内声明变量(使用var
关键字)。
请注意,Javascript没有块范围;你不能在循环中这样做。