【问题标题】:Current index of a button array按钮数组的当前索引
【发布时间】:2016-01-19 10:24:26
【问题描述】:

如何只返回被点击按钮的索引?

这是让我担心的代码:

window.onload = function(){

var    description = document.getElementsByClassName('description'),
        buttons = document.getElementsByClassName('button');

var currD = 0; // this var stands for the current description that should be shown

var show = function(){

    for( var i = 0; i < description.length; i++ ){

        if( i !== currD ){
            description[i].style.display='none';
        }

        else if( i === currD ){
            description[i].style.display='block';   
        }

    }

};

  for (var i = 0; i < buttons.length; i++){
    buttons[i].addEventListener('click', function(){
        currD = i;
        console.log(i);
    });
}

    window.setInterval(show,300);
};

每次单击按钮时,for 循环都会返回最后一个元素。

由于我在此页面上没有太多按钮,所以我采用了不熟练的旧方法:

window.onload = function(){

var description = document.getElementsByClassName('description'),
    buttons = document.getElementsByClassName('button');

    var currD = 0; // this var stands for the current description that should be shown

    var show = function(){

        for( var i = 0; i < description.length; i++ ){

            if( i !== currD ){
                description[i].style.display='none';
            }

            else if( i === currD ){
                description[i].style.display='block';   
            }

        }

    };

buttons[0].addEventListener('click', function(){
    currD = 0;
});

buttons[1].addEventListener('click', function(){
    currD = 1;
});

buttons[2].addEventListener('click', function(){
    currD = 2;
});

        window.setInterval(show,300);
    };

这可行,但如果我想添加更多按钮,设置所有事件侦听器会浪费时间。

【问题讨论】:

标签: javascript arrays indexing


【解决方案1】:

这是一个常见的 CLOSURE 问题。这应该有效:

for (var i = 0; i < buttons.length; i++){

    (function (_i) {
        buttons[_i].addEventListener('click', function(){
          currD = _i;
          console.log(_i);
        });
    })(i);

}

另一种解决方案:

for (var i = 0; i < buttons.length; i++){

    buttons[i].addEventListener('click', function(){
        return function() {
            currD = i;
            console.log(i);
        }
    });
}

您甚至可以在这里阅读更多关于闭包的信息:http://www.w3schools.com/js/js_function_closures.asp,但还有很多其他有趣的文章。只是 google javascript 关闭

对于你的具体例子,也许这样的东西也可以工作:

for (var i = 0; i < buttons.length; i++){
    buttons[i].addEventListener('click', function(e){
        currD = buttons.indexOf( e.currentTarget );
        console.log(currD);
    });
}

【讨论】:

  • 第一个解决方案很糟糕,第二个解决方案不起作用:(.
  • 大声笑。这些是关闭的解决方案。为什么函数包装器很糟糕?无论如何,你能创建一个 jsFiddle 以便我们展示它的工作原理吗?
  • 在第一个解决方案中,您在每一轮都创建一个新函数,虽然可行,但被认为是一种不好的做法。在处理函数内部的第二个 sn -p i 是事件对象,而不是循环变量。
  • 另外,第二个解决方案与第一个解决方案做同样的事情。是的,这就是闭包的想法,您需要为每个元素创建一个函数。否则你将没有 i 变量!。您需要为每个按钮设置不同的功能,并带有相应的“i”。
  • 其实第二种方案doesn't work at all.
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-15
  • 2019-12-24
  • 1970-01-01
  • 2011-01-27
相关资源
最近更新 更多