在 foreach 循环中添加 onclick 事件监听器不起作用
Adding onclick event listener within a foreach loop not working
我在 for 循环中生成并添加 html,然后尝试添加 onclick 事件,但由于某些原因,它在同一个循环中不起作用:
items.forEach(item => {
itemHtml = `<div class="${item.id}">${item.id}</div>`;
$(".itemsWrapper").html($(".itemsWrapper").html() + itemHtml);
$(`.itemsWrapper > .${item.id}`).on("click", () => {
console.log(`${item.id} was clicked`);
});
})
但是,如果我将它分成两个 forEach 循环,它就可以正常工作:
items.forEach(item => {
itemHtml = `<div class="${item.id}">${item.id}</div>`;
$(".itemsWrapper").html($(".itemsWrapper").html() + itemHtml);
})
items.forEach(item => {
$(`.itemsWrapper > .${item.id}`).on("click", () => {
console.log(`${item.id} was clicked`);
});
})
如果您确实单击了最后打印的项目,控制台将显示该消息。发生这种情况是因为您在第二次和下一次迭代中将 html 替换为新的,因此您的事件处理程序消失了。
items.forEach(item => {
itemHtml = `<div class="${item.id}">${item.id}</div>`;
// in this line, you're replacing the html from the previous iteration and, in
// consecuence, deleting the event handlers.
$(".itemsWrapper").html($(".itemsWrapper").html() + itemHtml);
// instead of the previous line, you can do something like this and it will work
// as expected
$(".itemsWrapper").append(itemHtml);
$(`.itemsWrapper > .${item.id}`).on("click", () => {
console.log(`${item.id} was clicked`);
});
});
这是一个带有工作示例的代码笔:https://codepen.io/kmsdevnet/pen/wvzGYpg
我在 for 循环中生成并添加 html,然后尝试添加 onclick 事件,但由于某些原因,它在同一个循环中不起作用:
items.forEach(item => {
itemHtml = `<div class="${item.id}">${item.id}</div>`;
$(".itemsWrapper").html($(".itemsWrapper").html() + itemHtml);
$(`.itemsWrapper > .${item.id}`).on("click", () => {
console.log(`${item.id} was clicked`);
});
})
但是,如果我将它分成两个 forEach 循环,它就可以正常工作:
items.forEach(item => {
itemHtml = `<div class="${item.id}">${item.id}</div>`;
$(".itemsWrapper").html($(".itemsWrapper").html() + itemHtml);
})
items.forEach(item => {
$(`.itemsWrapper > .${item.id}`).on("click", () => {
console.log(`${item.id} was clicked`);
});
})
如果您确实单击了最后打印的项目,控制台将显示该消息。发生这种情况是因为您在第二次和下一次迭代中将 html 替换为新的,因此您的事件处理程序消失了。
items.forEach(item => {
itemHtml = `<div class="${item.id}">${item.id}</div>`;
// in this line, you're replacing the html from the previous iteration and, in
// consecuence, deleting the event handlers.
$(".itemsWrapper").html($(".itemsWrapper").html() + itemHtml);
// instead of the previous line, you can do something like this and it will work
// as expected
$(".itemsWrapper").append(itemHtml);
$(`.itemsWrapper > .${item.id}`).on("click", () => {
console.log(`${item.id} was clicked`);
});
});
这是一个带有工作示例的代码笔:https://codepen.io/kmsdevnet/pen/wvzGYpg