javascript - 在动态 html 元素上添加点击事件
问题描述
我看了this example how to add click event on dynamic generate element jquery
它似乎接近我的问题,但我无法解决它。
我希望能够使用 javascript 制作项目并在我添加的每一行上添加一个单击事件处理程序。
我制作了这个小片段来说明我的问题。
我的问题:该事件仅添加到最后一行。
这是我的代码。
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>
解决方案
问题是添加元素的位置。它实际上是重新创建已经创建的元素,取消链接之前设置的点击事件。
document.getElementById(`divContainer`).innerHTML += newelement;
所以要解决这个问题,不要重新创建元素的 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);
});
}
推荐阅读
- python - 如何根据一组预设的可接受值检查列表中每个项目的值
- javascript - Javascript – 动态创建的元素上的事件委托不起作用
- swift - 为什么我的 ObservedObject 已更新但未在视图中显示其更新的内容
- java - 无法使用不同的作业名称和组运行同一类,同时运行
- python - 如何在 Python 中关闭 Discord 机器人的日志记录?
- flutter - Flutter - 索引 0、1 和 2 的节点的 Firebase RTDB 读取问题
- c - 分段错误(核心转储) - argv - c
- progressive-web-apps - 更改 Blazor 离线镀铬窗口样式
- node.js - Node.js - 监控每个进程的网络使用情况
- flutter - FutureBuilder with Provider: List 不是 Future 类型的子类型