我有一个循环,我试图使用他们自己的ID号进行onclicks,但它不断更新到循环中的最后一个数字 - 我想知道如何阻止它写入变量,以便他们保留自己的数字?
这就是我所拥有的:
count = 0;
for(i in my_array){
if(my_array[i][2])){ //if the data value is true
document.getElementById('div_id_'+count).onclick = function()
{
alert(i);
};
count++;
}
}
事情是警觉的(i)总是显示my_array的最后一个值...所以我想知道如何在每次写入时停止它,以便每个div可以解析自己的值?
答案 0 :(得分:3)
您正遇到Closure的问题。这是一个棘手的话题。查看此网址:http://code.google.com/apis/ajax/playground/#closure_for_events
基本上,单击元素时会评估i
值;不是在分配事件时,因此在此时i
被设置为循环中的最后一个值。您需要创建一个单独的函数来绑定到带有i
参数的click事件。一个例子:
function HandleClick(i){
return function() { alert(i); };
}
count = 0;
for(i in my_array){
if(my_array[i][2])){ //if the data value is true
document.getElementById('div_id_'+count).onclick = HandleClick(i);
count++;
}
}
现在HandleClick
函数正在为i
创建自己的闭包,它将被设置为从循环传入的值。
答案 1 :(得分:1)
count = 0;
my_array.forEach(function(i) {
if(my_array[i][2])){ //if the data value is true
document.getElementById('div_id_'+count).onclick = function()
{
alert(i);
};
count++;
}
});
如果my_array是Object而不是Array
count = 0;
Object.keys(my_array).forEach(function(i) {
if(my_array[i][2])){ //if the data value is true
document.getElementById('div_id_'+count).onclick = function()
{
alert(i);
};
count++;
}
});
答案 2 :(得分:1)
将值存储在元素中:
var count = 0;
for (var i in my_array)
{
if (my_array[i][2])) //if the data value is true
{
var el = document.getElementById('div_id_'+count);
el.setAttribute("my_value", i);
el.onclick = function()
{
alert(this.getAttribute("my_value"));
};
count++;
}
}