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

移除购物车商品时确认弹窗异常问题

问题分析与解决

你的问题出在两个核心点上:

  • 多余的e.target判断逻辑:如果删除按钮内部包含子元素(比如图标、文字节点),点击时e.target会指向子元素而非按钮本身,此时子元素没有data-product_id属性,判断条件不成立,直接跳过确认弹窗执行删除操作。单个商品时你大概率点中按钮本体,所以功能正常;多个商品时容易误点到子元素,就出现了直接删除的异常。
  • 循环绑定的逻辑冗余:你已经通过循环给每个按钮单独绑定了事件,完全没必要再判断当前点击目标和按钮的product_id是否一致。

修复后的代码方案一(简化现有逻辑)

直接去掉多余判断,在点击事件里直接弹出确认框,确保逻辑简洁可靠:

const productsButtons = document.querySelectorAll(".remove");

function removeProductButton() {
  for (let i = 0; i < productsButtons.length; i++) {
    productsButtons[i].addEventListener("click", (e) => {
      if (!confirm("你确定要删除这个商品吗?")) {
        e.preventDefault();
        e.stopPropagation();
      }
    });
  }
}

removeProductButton();

更优方案(事件委托)

如果你的购物车商品是动态添加/删除的,推荐用事件委托绑定在父容器上,这样无需每次DOM更新后重新绑定事件,代码更健壮:

// 替换成你实际的购物车父容器选择器,比如.cart-list
document.querySelector(".cart-list").addEventListener("click", (e) => {
  // 确认点击的是删除按钮(包括按钮内部子元素的情况)
  const removeBtn = e.target.closest(".remove");
  if (removeBtn) {
    if (!confirm("你确定要删除这个商品吗?")) {
      e.preventDefault();
      e.stopPropagation();
    }
  }
});

事件委托的优势

  • 避免循环绑定大量事件监听器,减少内存消耗
  • 动态新增的商品删除按钮会自动生效,不用重复调用绑定函数
  • 不用担心元素被移除后残留无效事件引用的问题

内容的提问来源于stack exchange,提问作者takumi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 15:15:32