使用标准DOM操作创建调用相同事件处理程序的按钮

时间:2016-04-14 16:09:57

标签: javascript javascript-events

我实际上要做的是使用按钮生成容器,这些按钮具有相同的处理程序但是获得不同的参数:

<div id="container">
    <button onclick="onclick_handler(1)">1</button>
    <button onclick="onclick_handler(2)">2</button>
    <button onclick="onclick_handler(3)">3</button>
</div>

使用此:

function onload_handler() {
    var container = document.getElementById("container");
    var i;
    for (i = 0; i < 3; i++) {
        var button = document.createElement('button');
        button.innerHTML = i;
        button.addEventListener('click', function() {
             onclick_handler(i);
        });
        container.appendChild(button);
    }
}

function onclik_handler(val) {
    console.log(val);
}

当我点击按钮时,我在控制台中得到4。我做错了什么?

是否可以在不使用匿名函数的情况下完成?

1 个答案:

答案 0 :(得分:3)

尝试通过每次迭代创建一个范围

来解决闭包创建的问题
function(i){
  button.addEventListener('click', function() {
    onclick_handler(i);
  });
})(i);

您的完整代码将是,

function onload_handler() {
    var container = document.getElementById("container");
    var i;
    for (i = 0; i < 3; i++) {
        var button = document.createElement('button');
        button.innerHTML = i;
        (function(i){
          button.addEventListener('click', function() {
             onclick_handler(i);
          });
        })(i)
        container.appendChild(button);
    }
}

function onclik_handler(val) {
    console.log(val);
}