动态地向元素添加onclick,传递函数参数

时间:2014-12-11 14:56:58

标签: javascript jquery html dom

我有一个预加载的页面,我正在尝试将onclick事件添加到具有特定类名的所有节点。但是onclick中的函数应该使用其中的元素节点。

var elemArr=document.getElementsByClassName('ABC');

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

        elemArr[i].onclick = function()
        {
            console.log(elemArr[i]);  // This is being returned as undefined
            // How can I use elemArr[i] here 
        };
    }

我试过

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

    printObj=elemArr[i];
    elemArr[i].onclick = function()
    {
        console.log(printObj);
        var newObject = jQuery.extend(true, {}, printObj);
        console.log(newObject );
    };
}

但是没有工作。我觉得上面的工作还是不行。我该如何解决这个问题..?

1 个答案:

答案 0 :(得分:6)

您应该使用loop将代码包装在function内,以便为每个事件处理程序创建i的新副本,如下所示。

&#13;
&#13;
var elems = document.getElementsByClassName('elem');

if (elems.length) {
  for (var i = 0, l = elems.length; i < l; i++) {
    (function(i) {
      elems[i].onclick = function() {
        alert('Element #' + i);
      }
    })(i);
  }
}

// Could also use bind for slighlty cleaner code
// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/bind

for (var i = 0, l = elems.length; i < l; i++) {
  elems[i].onmousedown = (function(index, e) {
    console.log('MouseDown - Element  #' + index);
  }).bind(elems[i], i);
}
&#13;
<div class="elem">Elem #1</div>
<div class="elem">Elem #2</div>
<div class="elem">Elem #3</div>
&#13;
&#13;
&#13;