You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

无法为JavaScript动态创建的li元素添加事件监听器如何解决?

解决方案

有两种常用实现方式,优先推荐使用事件委托方案,HTML代码无需做任何修改,只需调整JS逻辑即可:

方案1:创建li元素时直接绑定双击事件

在创建新li节点的逻辑中直接绑定双击事件,修改后的JS代码如下:

// Declaring Variables
let inputbtn = document.getElementById('input-but');
let addBtn = document.getElementById('add-button');
let list = document.getElementById('text');
addBtn.addEventListener('click', getVal)
// Adding Function to Add New task  
function getVal() {
    let value = inputbtn.value;
    if (value === "") {
        alert("Please fill out this field.")
    }
    else {
        let newElement = document.createElement('li')
        let liText = document.createTextNode(value)
        newElement.appendChild(liText)
        // 新增双击删除事件绑定
        newElement.addEventListener('dblclick', () => {
            newElement.remove()
        })
        list.appendChild(newElement)
    }
    document.myForm.reset()
}

方案2:事件委托(更推荐)

将事件绑定在静态存在的父元素ul上,利用事件冒泡机制实现对所有动态生成li的事件监听,无需每次创建元素重复绑定,性能更优:

// Declaring Variables
let inputbtn = document.getElementById('input-but');
let addBtn = document.getElementById('add-button');
let list = document.getElementById('text');
addBtn.addEventListener('click', getVal)
// 父级绑定双击事件,适配所有动态子元素
list.addEventListener('dblclick', (e) => {
    // 校验触发事件的元素是否为li节点
    if(e.target.tagName === 'LI') {
        e.target.remove()
    }
})
// Adding Function to Add New task  
function getVal() {
    let value = inputbtn.value;
    if (value === "") {
        alert("Please fill out this field.")
    }
    else {
        let newElement = document.createElement('li')
        let liText = document.createTextNode(value)
        newElement.appendChild(liText)
        list.appendChild(newElement)
    }
    document.myForm.reset()
}

内容的提问来源于stack exchange,提问作者Mohit Kumar Patel

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 23:09:02