简体   繁体   English

在动态 html 元素上添加点击事件

[英]Add click event on dynamic html elements

I looked at this example how to add click event on dynamically generate element jquery我看了this example how to add click event on dynamic generate element jquery

It seemed close to my problem but I could not resolve it.它似乎接近我的问题,但我无法解决它。

I want to be able to make items with javascript and add a click event handler on every row I add.我希望能够使用 javascript 制作项目,并在我添加的每一行上添加一个单击事件处理程序。
I have made this little snippet to illustrate my issue.我制作了这个小片段来说明我的问题。

My Issue: The event is only added on the last row.我的问题:该事件仅添加到最后一行。

Here is my code.这是我的代码。

 let items = [{name: "John"},{name: "Bob"},{name: "Joe"}]; let templatehtml = ` <label id="lblnumber{id}">{name}</label> <button id="btnView{id}" type="button" class="btn btn-primary">View</button> <br> `; items.forEach((item,index) => { item.index = index; AddUIitem(item,templatehtml); }); function AddUIitem(item,itemTemplate) { itemTemplate = itemTemplate.replace(/{id}/g, item.index); itemTemplate = itemTemplate.replace(/{name}/g, item.name); document.getElementById(`divContainer`).innerHTML += `${itemTemplate}`; document.getElementById(`btnView${item.index}`).addEventListener('click',()=>{ alert('Cliked ' + item.index); }); }
 <div id="divContainer"></div>

  function AddUIitem(item,itemTemplate)
  {
      itemTemplate = itemTemplate.replace(/{id}/g, item.index);
      itemTemplate = itemTemplate.replace(/{name}/g, item.name);
      document.getElementById(`divContainer`).innerHTML += `${itemTemplate}`;

      document.getElementById(`btnView${item.index}`).addEventListener('click',()=>{
          alert('Clicked ' + item.index);
      });
  } 
</script>

Problem is where the element is added.问题是添加元素的位置。 it is actually recreating the elements that have already been created un-linking the click events that have been set prior.它实际上是重新创建已经创建的元素,取消链接之前设置的点击事件。

document.getElementById(`divContainer`).innerHTML += newelement;

So to solve this do not recreate the html of the element, instead add the new element to the existing container(element)所以要解决这个问题,不要重新创建元素的 html,而是将新元素添加到现有容器(元素)

function AddUIitem(item,itemTemplate)
{

    itemTemplate = itemTemplate.replace(/{id}/g, item.index);
    itemTemplate = itemTemplate.replace(/{name}/g, item.name);

    let card = document.createElement("div");
    card.innerHTML = itemTemplate;

    document.getElementById(`divContainer`).appendChild(card);

    document.getElementById(`btnView${item.index}`).addEventListener('click',()=>{
        alert('Clicked ' + item.index);
    });
}

add your attribute values to class instead of id.将您的属性值添加到 class 而不是 id。 and use "this" keyword并使用“this”关键字

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM