这是因为在循环中,每次执行'document.getElementById("appList").innerHTML += ... '时,会重新渲染整个'appList'的 HTML 内容。而在重新渲染之前,之前的'addBtn'元素已经被替换掉了,所以之前的点击事件失效了。

解决这个问题的方法是将点击事件绑定放在循环结束后执行,可以通过给每个'addBtn'元素添加一个唯一的'id',然后在循环结束后再遍历所有的'addBtn'元素,给它们绑定点击事件。

以下是修改后的代码:

function freshAppList() {
    appData.forEach(function(item, index) {
        var currentAppData = item;
        var li = document.createElement("li");
        li.className = "mdui-list-item mdui-ripple";
        li.innerHTML = `
            <div class="mdui-list-item-avatar" style="border-radius: 8px;background: #fff;">
                <img src="${item.icon}" style="border-radius: 8px;"/>
            </div>
            <div class="mdui-list-item-content">${item.name}</div>
            <i class="mdui-list-item-icon mdui-icon material-icons" id="addBtn_${index}">add</i>
        `;
        document.getElementById("appList").appendChild(li);
    });

    for (var i = 0; i < appData.length; i++) {
        document.getElementById(`addBtn_${i}`).onclick = function() {
            console.log(appData[i]);
        };
    }
}

这样修改之后,每个'addBtn'元素都会正确地绑定点击事件,并且可以输出对应的'currentAppData'。


原文地址: https://www.cveoy.top/t/topic/oyIb 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录