创建另一个事件监听器时,Javascript 事件监听器消失

标签 javascript dom-events addeventlistener

我正在尝试创建一个脚本,其中选择的 HTML 对象检测更改、获取其值并创建另一个标签以根据其值进行显示。例如。用户选择“英国”和 div 中显示的标签。这可行,但我有一个 X 按钮,单击时会使用 EventListener 删除标签。问题是我只能删除创建的最终标签,因为用于创建每个标签 ID 的变量会发生变化,因此只有最后一个有效。部分代码如下:

 document.getElementById("locations-editor-container1").innerHTML = 
    document.getElementById("locations-editor-container1").innerHTML+"<div 
    class='locations-editor-country-disp' id='"+country+"[@]'>"+country+"<svg  
   id='"+country+"[##]' class='locations-editor-x-button' 
   style='width:2vh;position:absolute;right:0.5vw;vertical-align:middle;' 
   viewBox='0 0 24 24'><path fill='#FFFFFF' 


      d='M19,6.41L17.59,5L12,10.59L6.41,
      5L5,6.41L10.59, 12L5,17.59L6.41,19L12,13.41L17.59,19L19,17.59L13.41,12L19,6.41Z'/></svg></div><br>";
            var countryId=country+"[##]";
            
     document.getElementById(countryId).addEventListener("click",function(){ remove(countryId)},false);

最佳答案

下面是您的错误重现,因为您正在替换某些内容的innerHTML,您正在删除要替换的元素的事件监听器。这就是为什么只有最后一个元素起作用:

const content = document.querySelector("#content");
var counter = 0;
const add = e => {
  content.innerHTML = 
      //you are replacing content, thus removing the event listeners of 
      //  previous elements
      content.innerHTML +
    `<div style="cursor: pointer;" id="div${++counter}">
        click me ${counter}
    </div>`;
  document.querySelector(`#div${counter}`)
  .addEventListener(
    "click"
    ,(x=>e=>{
      alert(`Counter for this div:${x}`);
    })(counter)
  );
}
document.querySelector("#myButton").addEventListener(
  "click"
  ,add
);
<div id="content">
</div>
<input type="button" id="myButton" value="add">

解决方案是不替换内容,而是将新项目添加到现有内容中:

    const content = document.querySelector("#content");
    var counter = 0;
    const add = e => {
      //create a div (will not be added to dom yet)
      const div = document.createElement("div");
      div.innerHTML = 
        `<div style="cursor: pointer;" id="div${++counter}">
          click me ${counter}
        </div>`;
      div
      .addEventListener(
        "click"
        ,(x=>e=>{
          alert(`Counter for this div:${x}`);
        })(counter)
      );
      //add element to dom (do not replace content)
      content.appendChild(div);
    }
    document.querySelector("#myButton").addEventListener(
      "click"
      ,add
    );
    <div id="content">
    </div>
    <input type="button" id="myButton" value="add">

关于创建另一个事件监听器时,Javascript 事件监听器消失,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47254699/

相关文章:

javascript - 跨度元素高度问题

javascript - form.submit() 不起作用

javascript - 使用 UglifyJS 缩小多个文件

javascript - 当我使用参数触发自定义事件时,事件处理程序的参数未定义

javascript - 为什么没有引发点击事件?

javascript - 如何将数字输入保持为数字数据类型

javascript - 传递整个对象真的是做到这一点的方法吗?

javascript - dojo 相当于事件 .change()

javascript - JavaScript 中的反向事件冒泡

Javascript:通过 eventListener 单击重新加载页面