动态添加的事件处理程序禁用 Javascript 中的前一个事件处理程序

dynamically added event handler disables the previous one in Javascript

我正在 Javascript 中动态创建按钮。 还为每个按钮动态添加一个事件处理程序。 对于最后一个按钮,它可以工作,但之前的按钮不再起作用。这是我的一小段代码。我做错了什么?

<html>

<head>
    <script>
    var id = 0;

    function makeFunc(arg) {
        return function() {
            alert('selected ' + arg)
        }
    };

    function addElement() {
        document.getElementById('p1').innerHTML +=
            '<button id=\'id' + id + '\'>Button' + id + '</button>';
        document.getElementById('id' + id).onclick = makeFunc(id);
        id++;
    }
    </script>
</head>

<body>
    <button onclick="addElement();">Add Button</button>
    <p id="p1"></p>
</body>

</html>

它也在这里:http://jsfiddle.net/q52a7fw0/

当你使用innerHTML喜欢

 document.getElementById('p1').innerHTML +=
            '<button id=\'id' + id + '\'>Button' + id + '</button>';

覆盖 现有的事件处理程序。

相反,您应该创建元素并附加它

function addElement() {
  var button = document.createElement('BUTTON');
  button.id = id;
  button.textContent = 'Button ' + id;
  button.onclick = makeFunc(id);
  document.getElementById('p1').appendChild(button);

  id++;
}

var id = 0;

function makeFunc(arg) {
  return function() {
    alert('selected ' + arg)
  }
};

function addElement() {
  var button = document.createElement('BUTTON');
  button.id = id;
  button.textContent = 'Button ' + id;
  button.onclick = makeFunc(id);
  document.getElementById('p1').appendChild(button);

  id++;
}
<body>
  <button onclick="addElement();">Add Button</button>
  <p id="p1"></p>
</body>