Javascript:从一个对象数组中调用一个函数

时间:2016-02-28 00:42:46

标签: javascript

我有一个对象数组,我正在构建一个包含这些对象的页面 对象有一个图像,图像将是可点击的,我想计算每个图像的点击次数。 我正在尝试将每个对象的点击值分配给" tclicks"并且比手" tclicks"转到onclick函数以分别计算点击次数。 我不确定这是否有效。

我当前的问题是,当执行onclick函数时,该值显示为NaN。 我知道我需要为点击分配一个起始值。 我在各个地方尝试过。 在对象中,在函数外部的函数中。要么值没有计数,要么因为元素设置为0而出错 我在哪里可以指定起始值?

这是数组

var things = 
[
{img : "cat.jpg",
tclicks: "cleo_clicks",
id : "cleo"
},

{img : "shimi.png",
tclicks: "shimi_clicks",
id : "shimi" 
}
]

这就是我构建页面的方式     for(var i = 0; i< things.length; i ++){

var x = document.createElement("IMG");
x.setAttribute("src", things[i].img);
x.setAttribute(tclicks, things[i].clicks);
x.setAttribute("onclick", "countClicks(tclicks)");

document.body.appendChild(x);


}

这是我的onclick功能

function countClicks(clicks){

clicks ++;
console.log(clicks)

}

2 个答案:

答案 0 :(得分:1)

没有理由你可以指定click = 0来定义像这样的对象数组:

var things = [
  {
    img: "cat.jpg",
    tclicks: "cleo_clicks",
    id: "cleo",
    clicks: 0
  },
  {
    img: "shimi.png",
    tclicks: "shimi_clicks",
    id: "shimi",
    clicks: 0 
  }
];

......但这只是问题的一半。

在点击增量功能中:

function countClicks(clicks) {
  clicks++;
  console.log(clicks);
}

...您永远不会影响对任何对象的点击属性的更改,因为Javascript按值(https://en.wikipedia.org/wiki/Evaluation_strategy#Call_by_value)传递函数参数。

您需要将整个对象传递给函数,并允许它修改属性值:

function countClicks(someObject) {
  someObject.clicks++;
  console.log(someObject.clicks);
}

...这意味着您需要更改函数的调用方式,例如:

x.setAttribute("onclick", "countClicks(things[i])");

注意:上面假设数组是全局的,否则你需要进一步重构。

最后一点,调用JS pass-by-value简化了一点。您可以在此处深入探讨此问题:Is JavaScript a pass-by-reference or pass-by-value language?

答案 1 :(得分:1)

是的。使用一个对象并且不要像onClick那样用力写。这太危险了。你可以覆盖它。请改用eventListener。

function CountClicks(config){
    var img     = config.img;
    var tclicks = config.tclicks;
    var id      = config.id;
        var clicks  = 0;
    return{
        countUp: function(){
            clicks++;           
        },
        countDown: function(){
            clicks--;           
        },
        getCount: function(){
            return clicks;
        }
    }
}


x.counter = new CountClicks(things[i]);
x.addEventListener('click', function(){this.counter.countUp()});