【问题标题】:why this addEventListener not working for the li element I create?为什么这个 addEventListener 不适用于我创建的 li 元素?
【发布时间】:2019-05-01 02:38:13
【问题描述】:

我尝试实现自动完成输入。我希望当用户单击新添加的 li 元素时,输入值将是 li 元素的值。但是,这个 addEventListener 似乎在这个函数中不起作用。我可以知道为什么吗?我认为每个新的 li 元素在我向它们添加事件侦听器之前都会创建。

function displayMatches(matchesArr) {
  var newLi;
  for (let j of matchesArr) {
    newLi = document.createElement('li');
    newLi.innerHTML = `<li id="${j.replace(/\s/g,'')}">${j}</li>`;
    autoResults.innerHTML += newLi.innerHTML;
    document.getElementById(j.replace(/\s/g, '')).addEventListener("click",
      function(e) {
        alert("Hello World!");
      })
  }
}

如果我使用 NewLi,它也不起作用。

newLi.addEventListener("click", 
    function(e) {
        alert("Hello World!");
    })

【问题讨论】:

  • 您真的要将一个 LI 放入另一个 LI 中吗?
  • @Ying 我已经删除了我的答案,因为它不正确。祝你好运!
  • 您好!不,我想将 li 添加到已经在 html 中的 ul

    标签: javascript addeventlistener


    【解决方案1】:

    您添加到 DOM 的 linewLi 不同。当您分配给.innerHTML 时,您正在创建一个全新的元素。您还破坏并重新创建了autoResults 中的所有旧元素。当您分配给 .innerHTML 时,它会从头开始解析 HTML 文本,创建所有新元素;在旧元素上设置的任何属性(例如事件侦听器)都将丢失。

    不是分配给.innerHTML,而是附加元素本身。

    function displayMatches(matchesArr) {
      var newLi;
      for (let j of matchesArr) {
        newLi = document.createElement('li');
        newLi.id = j.replace(/\s/g, '');
        newLi.innerHTML = j;
        newLi.addEventListener("click",
          function(e) {
            alert("Hello World!");
          });
        autoResults.appendChild(newLi);
      }
    }

    【讨论】:

    • 非常感谢!有用!所以问题是这一行“autoResults.innerHTML += newLi.innerHTML;”正确的?当我们给一个元素的innerHTML赋值时,我们之前给这个元素赋值的所有东西都会丢失?
    • 是的,这正是我写的。
    猜你喜欢
    • 2019-04-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多