Javascript 向动态添加的列表元素添加事件侦听器
我对JavaScript编程非常陌生,我正在尝试学习JavaScript中的事件处理程序。我在动态创建的元素上添加事件处理程序。我制作了一个简单的购物清单代码,通过它我可以将数据输入到清单中,我在每个项目的右侧添加了一个删除图标。我在该图标上添加了事件处理程序,但它仅适用于清单中已经存在的项目,而不适用于动态添加的项目 我花了大约一天的时间试图找到方法,但仍然无法找到用纯JavaScript实现这一目标的正确方法。我已经阅读了几乎所有关于堆栈溢出的答案和许多其他资源,但仍然无法获得解决方案,我在找到解决方案时,借助了其中一个关于堆栈溢出的答案,这是纯JavaScript 问题链接: 这个问题和我的问题很相似,但我按照答案所说的做了尝试,但仍然不适合我Javascript 向动态添加的列表元素添加事件侦听器,javascript,html,Javascript,Html,我对JavaScript编程非常陌生,我正在尝试学习JavaScript中的事件处理程序。我在动态创建的元素上添加事件处理程序。我制作了一个简单的购物清单代码,通过它我可以将数据输入到清单中,我在每个项目的右侧添加了一个删除图标。我在该图标上添加了事件处理程序,但它仅适用于清单中已经存在的项目,而不适用于动态添加的项目 我花了大约一天的时间试图找到方法,但仍然无法找到用纯JavaScript实现这一目标的正确方法。我已经阅读了几乎所有关于堆栈溢出的答案和许多其他资源,但仍然无法获得解决方案,我在
document.querySelector("ul").addEventListener('click', function(event) {
if (event.target.tagName === "I") {
alert("hmm.. you clicked.");
}
});
小提琴链接:
var input=document.getElementById(“userinput”);
var enter=document.getElementById(“enter”);
var ul=文件查询选择器(“ul”);
var listItem=document.queryselectoral(“li”);
功能切换功能(e){
如果(e.target.tagName==“LI”){
e、 target.classList.toggle(“完成”);
}
}
函数addListItemOnClick(){
如果(input.value.length>0){
console.log(input.value.length);
var li=document.createElement(“li”);
appendChild(document.createTextNode(input.value));
ul.儿童(li);
input.value=“”;
var d=document.createElement(“div”);
d、 类列表。添加(“fas”、“fa垃圾”);
li.儿童(d);
}
}
函数addListItemOnPress(){
if(input.value.length>0&&event.keyCode==13){
var li=document.createElement(“li”);
appendChild(document.createTextNode(input.value));
ul.儿童(li);
input.value=“”;
var d=document.createElement(“div”);
d、 类列表。添加(“fas”、“fa垃圾”);
li.儿童(d);
}
}
输入.addEventListener(“单击”,addListItemOnClick);
input.addEventListener(“按键”,addListItemOnPress);
ul.addEventListener(“点击”,切换功能);
document.querySelector(“ul”).addEventListener(“单击”),函数(事件){
如果(event.target.tagName==“I”){
警报(“嗯……你点击了。”);
}
});代码>
.box{
文本对齐:居中;
边框:2件纯黑;
}
h1{
字体系列:富兰克林哥特式中字体、Arial窄字体、Arial无衬线字体;
字体大小:50px;
}
#首先{
字体大小:25px;
字体系列:“Gill Sans”,“Gill Sans MT”,“Calibri”,“Trebuchet MS”,无衬线;
文字装饰:下划线;
}
保险商实验室{
边框:1px纯黑;
填充:0;
}
李{
显示:块;
列表样式:无;
字体系列:“Lucida Sans”、“Lucida Sans Regular”、“Lucida Grande”、“Lucida Sans Unicode”、日内瓦、Verdana、无衬线;
字体大小:15px;
文本对齐:居中;
文字装饰:下划线;
}
#用户输入{
文本对齐:居中;
}
.完成{
文字装饰:线条贯通;
}
垃圾{
浮动:对;
}
Javascript+DOM
购物清单
今天就完成
进入
- 记事本
- 果冻
- 菠菜
- 米饭
- 生日蛋糕
- 蜡烛
添加的项目是div
标记元素。但原始项是i
标记元素。event.target.tagName==“I”
测试将只匹配I
标记,而不匹配div
标记
更新添加的项目代码(在addListItemOnClick
和addListItemOnPress
中):
将是:
document.createElement("i")
如果您分离数据、查看并使用html内联绑定(适用于小型项目,类似于angular/react/vue框架中的模板…),代码将变得更小、更干净
let数据=[
{name:“笔记本”},
{名称:“果冻”},
{名称:“菠菜”},
{名称:“大米”},
{姓名:“生日”},
{名称:“蜡烛”},
];
函数add(){
data.push({name:userinput.value});
userinput.value='';
刷新();
}
函数del(i){
数据拼接(i,1);
刷新();
}
函数刷新(){
items.innerHTML=data.map((x,i)=>`
${x.name}
`).加入(“”);
}
刷新()代码>
购物清单
今天就完成
进入
我建议您在问题中添加addListItemOnPress函数的代码。链接到fiddle是一个很好的开始,尽管通过添加函数实现,它并不完全符合“完整”问题的定义,但是任何人都可以重现您描述的确切问题。啊,以及回答评论中提到的addListItemOnClick。啊,您有两个函数addListItemOnClick和addListItemOnPress。当我将两者从div
更改为I
时,它对我有效。@Will Cain,然后我应该将event.target.tagName==“I”更改为event.target.tagName.toLowerCase()==“I”;alsoUppercaseevent.target.tagName==“I”
对我有效。看看上面我的小提琴。
document.createElement("i")