Javascript 如何正确地将循环中的参数传递给多个事件处理程序?

Javascript 如何正确地将循环中的参数传递给多个事件处理程序?,javascript,events,event-handling,Javascript,Events,Event Handling,可能重复: 我使用JS将事件处理程序添加到我网站上的多个HREF中,如下所示: function addButtonListener(){ var buttons = document.getElementsByClassName("selLink"); for (var i = 0; i < buttons.length; i++) { button.addEventListener('click',function() { addTosel(i); },tru

可能重复:

我使用JS将事件处理程序添加到我网站上的多个HREF中,如下所示:

function addButtonListener(){
  var buttons = document.getElementsByClassName("selLink");
  for (var i = 0; i < buttons.length; i++)
  {
      button.addEventListener('click',function() { addTosel(i); },true);
    }
  }
}
函数addButtonListener(){
var buttons=document.getElementsByClassName(“selLink”);
对于(变量i=0;i

但不幸的是,addTosel通过的是最后一个i,而不是循环中的i。如何将i相应地传递给此时正在处理的对象?

您需要创建一个闭包:

function addButtonListener(){
    var buttons = document.getElementsByClassName("selLink");

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

        button.addEventListener('click', function(index) { 
            return function () {
                addTosel(index);
            };
        }(i), true);
    }
}
函数addButtonListener(){
var buttons=document.getElementsByClassName(“selLink”);
对于(变量i=0;i
这样,处理程序的范围就绑定到
i
的适当上下文


有关此主题的更多信息,请参见此部分。

在声明函数时,需要将
i
变量绑定到函数。像这样

for (var i = 0; i < buttons.length; i++) {
  button.addEventListener('click',(function() { addTosel(this); }).bind(i) ,true);
}
for(变量i=0;i
注意:我刚刚从内存中编写了代码,因此它可能并不完美,但这是您需要的解决方案,用于参考正确的方法,例如使用跨浏览器垫片等。请看:


如果您打算采用
.bind
方法,请这样做

for (var i = 0; i < buttons.length; i++) {
   button.addEventListener('click', addTosel.bind(null, i), true);
}
然后做这个

for (var i = 0; i < buttons.length; i++) {
   button.addEventListener('click', _binder(addTosel, null, i), true);
}
for(变量i=0;i
听起来您需要一个“bind”函数来处理您编写的异步代码。我认为你搞乱了调用函数的位置和传递参数的位置。@pimvdb是的,它应该是外部匿名的,我的错。这会使索引成为一个
Number
对象。要使其保持原语,您需要
“使用strict”
for (var i = 0; i < buttons.length; i++) {
   button.addEventListener('click', _binder(addTosel, null, i), true);
}