我编写了一个代码,通过动态创建各种标签的元素,在屏幕上显示食物项目.我将整个过程放在一个名为displayMenuItems的函数中.现在是第一组动态创建的按钮(即"添加btn"按钮),当我向它们添加事件时,单击时,事件将顺利启动.但是,第二组动态创建的按钮(即"删除btn"按钮)在添加事件时,单击时不会触发事件.当第二组按钮的代码与第一组按钮的代码相似时,我不知道为什么会出现这种复杂情况.你能解决这个问题吗,我会非常感激的?

const menu = [
  {
    id: 1,
    title: "GUNPOWDER GOBHI",
    category: "Small Plates",
    price: 16.99,
    img: "sp1.png",
    desc: `Crispy Cauliflower, Spicy Lentil Dust`,
  },
  {
    id: 2,
    title: "SHRIMP KOLIWADA",
    category: "Small Plates",
    price: 13.99,
    img: "sp2.jpg",
    desc: `Crispy Popcorn Style Fritters, Pickled Mango Sauce`,
  },
  {
    id: 3,
    title: "GHEE ROAST CHICKEN WINGS",
    category: "Small Plates",
    price: 6.99,
    img: "sp3.jpg",
    desc: `Kundapur Chicken Masala`,
  },
]

const sectionCenter = document.querySelector(".section-center");
const listContainer = document.querySelector('.list-container');

window.addEventListener("DOMContentLoaded", function () {
  diplayMenuItems(menu);
});

function diplayMenuItems(menuItems) {
  let displayMenu = menuItems.map(function (item) {

    return `<article class="menu-item">
          <img src=${item.img} alt=${item.title} class="photo" />
          <div class="item-info">
            <h4>${item.title}</h4>
            <h4 class="price">$${item.price}</h4>
            <p class="item-text">
              ${item.desc}
            </p>
            <button class="add-btn" data-title="${item.title}" data-price="$${item.price}">Add To List</button> 
          </div>
        </article>`;
  });
  displayMenu = displayMenu.join("");

  sectionCenter.innerHTML = displayMenu;

  const addBtns = document.querySelectorAll('.add-btn');

addBtns.forEach(function(btn){
btn.addEventListener('click', function(e){
    const title = e.currentTarget.dataset.title;
    const price = e.currentTarget.dataset.price;
    const para = document.createElement('div');
    para.classList.add('item-list');
    para.innerHTML = `<p class="item">${title}</p>
     <p class="item">${price}</p> 
     <button class="delete-btn" data-title="${title}">x</button>`
listContainer.appendChild(para);
});
});

const deleteBtns = document.querySelectorAll('.delete-btn'); 

deleteBtns.forEach(function(btn){
  btn.addEventListener('click', function(e){
      const title = e.currentTarget.dataset.title;
    console.log(title);
    

  });
});
}

推荐答案

最初不会生成delete-btns个元素,但您的事件只是第一次添加的,所以当您将删除事件添加到DOM中时,不会应用所有删除事件.

我建议您每次都应该直接在新添加的删除按钮上添加一个事件.

const menu = [{
    id: 1,
    title: "GUNPOWDER GOBHI",
    category: "Small Plates",
    price: 16.99,
    img: "sp1.png",
    desc: `Crispy Cauliflower, Spicy Lentil Dust`,
  },
  {
    id: 2,
    title: "SHRIMP KOLIWADA",
    category: "Small Plates",
    price: 13.99,
    img: "sp2.jpg",
    desc: `Crispy Popcorn Style Fritters, Pickled Mango Sauce`,
  },
  {
    id: 3,
    title: "GHEE ROAST CHICKEN WINGS",
    category: "Small Plates",
    price: 6.99,
    img: "sp3.jpg",
    desc: `Kundapur Chicken Masala`,
  },
]

const sectionCenter = document.querySelector(".section-center");
const listContainer = document.querySelector('.list-container');

window.addEventListener("DOMContentLoaded", function() {
  diplayMenuItems(menu);
});

//introduce `handleDelete` here
function handleDelete(element) {
    const title = element.dataset.title;
    console.log(title);
  }

function diplayMenuItems(menuItems) {
  let displayMenu = menuItems.map(function(item) {
    return `<article class="menu-item">
          <img src=${item.img} alt=${item.title} class="photo" />
          <div class="item-info">
            <h4>${item.title}</h4>
            <h4 class="price">$${item.price}</h4>
            <p class="item-text">
              ${item.desc}
            </p>
            <button class="add-btn" data-title="${item.title}" data-price="$${item.price}">Add To List</button> 
          </div>
        </article>`;
  });
  displayMenu = displayMenu.join("");

  sectionCenter.innerHTML = displayMenu;

  const addBtns = document.querySelectorAll('.add-btn');
  
  //Add `handleDelete` directly
  addBtns.forEach(function(btn) {
    btn.addEventListener('click', function(e) {
      const title = e.currentTarget.dataset.title;
      const price = e.currentTarget.dataset.price;
      const para = document.createElement('div');
      para.classList.add('item-list');
      para.innerHTML = `<p class="item">${title}</p>
     <p class="item">${price}</p> 
     <button class="delete-btn" data-title="${title}" onclick="handleDelete(this)">x</button>`
      listContainer.appendChild(para);
    });
  });
}
<div class="section-center">

</div>
<div class="list-container">

</div>

Javascript相关问答推荐

D3多线图显示1线而不是3线

当在select中 Select 选项时,我必须禁用不匹配的 Select

JQuery. show()工作,但. hide()不工作

CheckBox作为Vue3中的一个组件

在286之后恢复轮询

在css中放置所需 colored颜色 以填充图像的透明区域

使用线性插值法旋转直线以查看鼠标会导致 skip

如何在AG-Grid文本字段中创建占位符

有没有办法更改Chart.js 3.x.x中主要刻度的字体?

Jexl to LowerCase()和Replace()

AG-GRIDreact 显示布尔值而不是复选框

是否有静态版本的`instanceof`?

脚本语法错误只是一个字符串,而不是一个对象?

AstroJS混合模式服务器终结点返回404

如何调整下拉内容,使其不与其他元素重叠?

如何在css中裁剪成一定Angular 的圆的一部分,而不需要复杂的多边形

使用jQuery每隔几秒钟突出显示列表中的不同单词

在不使用AJAX的情况下将JavaScript数组值传递给Laravel控制器?

如何使用属性访问器定义循环的for...的局部变量

在Java脚本/类型脚本中覆盖父构造函数中的默认值