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

购物车功能JavaScript报错求助:addProductToCart相关问题排查

解决甜甜圈商店购物车JS报错:Cannot read properties of undefined (reading 'addEventListener')

错误根源分析

报错出现在addProductToCart函数第97行,核心是DOM元素未正确插入,导致后续获取元素返回undefined,无法调用addEventListener。存在两个关键拼写错误:

1. innerHTML属性拼写错误(直接触发报错)

你在addProductToCart中写了:

cartShopBox.innerHtml = cartboxContent;

正确属性名是innerHTML(首字母H大写),小写的innerHtml是无效属性,导致拼接的HTML内容完全没插入到cartShopBox中。后续尝试获取.cart-remove和.cart-quantity自然返回undefined,触发报错。

2. 商品标题类名拼写错误(潜在功能失效)

模板字符串里的标题类名写成了cart-profuct-title,正确应为cart-product-title(少写了一个d)。这个错误会导致判断商品是否已加入购物车的逻辑失效,因为cartItems.getElementsByClassName('cart-product-title')找不到对应元素。

修复后的核心代码

修正addProductToCart函数

function addProductToCart(title ,price ,productImg){
    var cartShopBox = document.createElement('div');
    cartShopBox.classList.add('cart-box');
    var cartItems = document.getElementsByClassName('cart-content')[0];
    var cartItemsNames = cartItems.getElementsByClassName('cart-product-title');
    for( var i =0;i<cartItemsNames.length;i++){
        if(cartItemsNames[i].innerText==title){
            alert("You have already add this item to cart");
            return;
        }
    }

    // 修正类名拼写,并替换静态内容为传入的商品参数
    var cartboxContent = `
    <img src="${productImg}"  class="cart-img">
    <div class="detail-box">
        <div class="cart-product-title">${title}</div>
        <div class="cart-price">${price}</div>
        <input type="number" value="1" class="cart-quantity">
    </div>
    <i class='bx bxs-trash cart-remove'></i>`;

    // 修正innerHTML拼写
    cartShopBox.innerHTML = cartboxContent;

    cartItems.append(cartShopBox);

    cartShopBox.getElementsByClassName('cart-remove')[0].addEventListener('click',removeCartItem);
    cartShopBox.getElementsByClassName('cart-quantity')[0].addEventListener('change',quantityChanged);
}

优化addCartClicked的元素获取逻辑

避免因点击图标子节点(若后续扩展)导致父元素获取错误:

function addCartClicked(event){
    // 确保获取到正确的.add-cart元素,不受子节点影响
    var button = event.target.closest('.add-cart');
    var shopProducts = button.parentElement;
    var title = shopProducts.getElementsByClassName('product-title')[0].innerText;
    var price = shopProducts.getElementsByClassName('price')[0].innerText;
    var productImg = shopProducts.getElementsByClassName('product-img')[0].src;

    addProductToCart(title,price,productImg);
    updatetotal();
}

优化总价计算逻辑

将总价更新代码移到循环外,避免重复执行:

function updatetotal(){
    var  cartContent = document.getElementsByClassName('cart-content')[0];
    var cartBoxes = cartContent.getElementsByClassName('cart-box');
    var total =0
    for( var i =0;i<cartBoxes.length;i++){
        var cartBox =  cartBoxes[i];
        var priceElement = cartBox.getElementsByClassName('cart-price')[0];
        var quantityElement= cartBox.getElementsByClassName('cart-quantity')[0];
        var price = parseFloat(priceElement.innerText.replace("$",""));
        var quantity = quantityElement.value ;
        total = total +(price*quantity);
        total =  Math.round(total *100)/100;
    }
    // 移到循环外,只执行一次更新
    document.getElementsByClassName('total-price')[0].innerText='$'+total;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 08:09:53