在函数调用时丢失事件监听器

Losing Event Listeners on Function Recall

更新:这里有一个更短更简单的片段来演示我的问题。尝试点击第一个按钮,它对应的事件监听器不起作用。只有第二个。

var a = {};
a.b = 0;
a.alert = () => {
 a.b++;
 document.getElementById('X').innerHTML += '<button id="_'+a.b+'">Button #'+a.b+'</button>';
 document.getElementById('_'+a.b).addEventListener('click',(e)=>{
  var p = document.getElementById('_'+a.b);
  p.parentElement.removeChild(p);
 });
}


a.alert();
a.alert();
<!DOCTYPE html>
<html lang="en">
<body>
<span id="X"></span>
</body>
</html>

更新:看来我真的输了。我检查了 DevTools,之前创建的元素在我再次执行函数时丢失了点击事件。

我想寻求一些帮助来尝试驯服事件监听器。似乎如果我尝试多次调用该函数,似乎只有最后一个函数有效,这是一个问题,因为我希望能够显示多个警报。这是我正在尝试做的事情。

这里有什么我遗漏的吗?或者这是使用对象包含函数的问题?

var alertify = {}
alertify.depth = [];
alertify.alert = (title, text, callback = () => {}) => {
 var uniq = 'uniqalert_'+uniqid();
 alertify.depth.push(uniq);
 var content =
 '<form onsubmit="return false" class="dialog" id="'+uniq+'">\
  <div class="box">\
   <div class="box_title">\
    <div class="box_title_content">'+title+'</div>\
    <img id="i'+uniq+'" src="'+operator.config.ximage+'">\
   </div>\
   <div class="box_content">'+text+'</div>\
   <div class="box_button">\
    <button class="yes" id="j'+uniq+'">OK</button>\
   </div>\
  </div>\
 </form>';
 selector('alertcontainer').innerHTML += content;
 var f = selector(uniq);
 selector('i'+uniq).addEventListener('click',()=>{
  callback();
  f.parentNode.removeChild(f);
 });
 selector('j'+uniq).addEventListener('click',()=>{
  callback();
  f.parentNode.removeChild(f);
 });
}

注意:我不属于 alertify/js 团队。我只是使用了那个 var 名称,因为我以前习惯使用它。

似乎附加 HTML 字符串,给它一个 ID,然后获取该 ID 是一种糟糕的做法。我发现将字符串转换为有效 HTML DOM element 的代码片段更好。不确定为什么旧代码不能按逻辑运行。如果有人能告诉我为什么旧代码是错误的,那就太好了。

function createElementFromHTML(htmlString) {
  var div = document.createElement('div');
  div.innerHTML = htmlString.trim();
  // Change this to div.childNodes to support multiple top-level nodes
  return div.firstChild; 
}

var a = {};
a.b = 0;
a.alert = () => {
 a.b++;

 var c = createElementFromHTML('<button id="_'+a.b+'">Button #'+a.b+'</button>');
 document.getElementById('X').appendChild(c);

 c.addEventListener('click',(e)=>{
  c.parentElement.removeChild(c);
 });
}

a.alert();
a.alert();
a.alert();
<!DOCTYPE html>
<html lang="en">
<body>
<span id="X"></span>
</body>
</html>