变量保持一个值

时间:2012-08-31 00:36:13

标签: javascript

我有一个循环,我试图使用他们自己的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可以解析自己的值?

3 个答案:

答案 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++;
    }   
}