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

JS求助:如何获取点击的单个商品而非整个商品数组?

点击购买按钮仅获取单个商品信息的解决方案

我希望点击商品对应的购买按钮时,仅获取该单个商品的信息,但目前点击后会直接获取整个商品数组。尝试使用event.target.id但未成功,以下是我的JS和HTML代码:

我的JS代码

const shopContainer = document.querySelector(".shop-content");

let productTitle;
let productDescription;
let productImage;
let productPrice;
let productCategory;
let productId;
let productKey = [];
let productArray = [];

let output = "";

const url = "https://fakestoreapi.com/products";

let data = fetch(url)
  .then((res) => res.json())
  .then((data) => {
    for (let i = 0; i < data.length; i++) {
      productTitle = data[i].title;
      productDescription = data[i].description;
      productImage = data[i].image;
      productPrice = data[i].price;
      productCategory = data[i].category;
      productId = data[i].id;
      productArray[i] = [
        productTitle,
        productDescription,
        productImage,
        productPrice,
        productCategory,
        productId,
      ];
      productKey[i] = data[i].id;
      localStorage.setItem(productKey[i], JSON.stringify(productArray[i]));
    }
    showApi();
    console.log(productArray)
  });

console.log(localStorage)

function showApi() {
  for (let i = 0; i < productArray.length; i++) {
    output += `
              <div class="product-box">
              <img class="product" src="${productArray[i][2]}" alt="product image">
              <h2 class="product-title">${productArray[i][0]}</h2>
                  <div class="bottom-box">
                  <span class="price">${productArray[i][3]}$</span>
                  <i class='bx bx-shopping-bag add-cart' id="${i}" onclick="returnKey()"></i>
                  </div>
                </div>
          `;
  }
  shopContainer.innerHTML = output;
  console.log(productArray);
};

let knapp = document.getElementsByClassName("bx bx-shopping-bag");

console.log(knapp);

let inputCart = document.querySelector(".inputCart")

function returnKey() {
  if (localStorage.length !== 0){
    Object.keys(localStorage).forEach(function (key){
    object = JSON.parse(localStorage.getItem(key))
    completeProduct = (object)

    let cartPrice = document.createElement("p");
    let cartTitle = document.createElement("p");
    let cartImage = document.createElement("img");
    inputCart.appendChild(cartPrice);
    inputCart.appendChild(cartImage);
    inputCart.appendChild(cartTitle);
    
    cartTitle.setAttribute("class", "cart-title")
    cartImage.setAttribute("src", completeProduct[2]);
    cartImage.setAttribute("width", "75");
    cartImage.setAttribute("height", "75");

    cartTitle.innerHTML = completeProduct[0];
    cartPrice.innerHTML = ("$" + completeProduct[3]);
  })
  inputCart.innerHTML = cartTitle;
  }
};

let removeBtn = document.getElementById("removebutton").addEventListener('click', clearCart);
let buyBtn = document.getElementById("buyBtn").addEventListener('click', buyCart);

function clearCart() {
  removeCart = window.confirm("Are you sure you want to clear your cart?");
  if (removeCart) {
    inputCart.innerHTML = "";
  }
}

function buyCart() {
    shopMore = window.confirm("Are you finished shopping?");
  if (shopMore) {
    alert("Thank your for shopping at CatchShop!");
    window.location.reload();
  }
}
       
let cartIcon = document.querySelector("#cart-icon");
let cart = document.querySelector(".cart");
let closeCart = document.querySelector("#close-cart");

cartIcon.onclick = () => {
  cart.classList.add("active");
};

closeCart.onclick = () => {
  cart.classList.remove("active");
};

let filterBtn = document.querySelector("#filter-button");
let filterContainer = document.querySelector(".filter-container");
let closeFilter = document.querySelector("#close-filterbox");

filterBtn.onclick = () => {
  filterContainer.classList.add("active");
};
closeFilter.onclick = () => {
  filterContainer.classList.remove("active");
};

我的HTML代码

<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <link rel="stylesheet" href="assets/css/style.css">
  <link href="https://fonts.googleapis.com/css2?family=Quicksand&family=Roboto&display=swap" rel="stylesheet">
  <link href='https://unpkg.com/boxicons@2.1.4/css/boxicons.min.css' rel='stylesheet'>
  <link rel="icon" href="./assets/images/android-chrome-192x192.png">
  <title>CatchShop</title>
</head>

<body>
  <header>
    <div class="nav container">
      <a href="index.html" class="logo">CatchShop</a>
      <a href="about.html">Contact</a>
      <a href="contact.html">About us</a>
      <i class='bx bxs-shopping-bag' id="cart-icon"></i>
      <div class="cart">
        <img class="companylogo" src="./assets/images/android-chrome-192x192.png" alt="logo">
        <h2 class="yourcart">Your Cart</h2>
        <i class='bx bx-x' id="close-cart"></i>
        <div class="inputCart"></div>
        <i class='bx bxs-trash-alt cart-remove' id="removebutton"></i>
        <button type="button" class="btn-buy" id="buyBtn">Buy now</button>
      </div>
    </div>
  </header>
  <section class="shop container">
    <div class="shop-content">
    </div>
  </section>
 <div id="showCars"></div>
  <footer>
    <div class="companyname">
      <a href="#" class="logo">CatchShop</a>
      <img class="footerlogo" src="./assets/images/android-chrome-192x192.png" alt="logo">
    </div>
    <div class="social-media">
      <a href="https://twitter.com/"><i class='bx bxl-twitter' id="social-media-icon"></i></a>
      <a href="https://www.instagram.com/"><i class='bx bxl-facebook' id="social-media-icon"></i></a>
      <a href="https://www.facebook.com/"><i class='bx bxl-instagram' id="social-media-icon"></i></a>
    </div>
  </footer>
  <script src="./assets/js/store.js"></script>
  <script src="./assets/js/main.js"></script>
</body>

</html>

问题修复方案

核心问题

当前returnKey()函数遍历了localStorage所有键,导致每次点击都添加全部商品;且点击事件未传递当前商品的唯一标识,无法定位单个商品。

1. 修改按钮点击事件,传递商品索引

在生成商品按钮时,把当前商品的索引传给returnKey函数:

function showApi() {
  for (let i = 0; i < productArray.length; i++) {
    output += `
              <div class="product-box">
              <img class="product" src="${productArray[i][2]}" alt="product image">
              <h2 class="product-title">${productArray[i][0]}</h2>
                  <div class="bottom-box">
                  <span class="price">${productArray[i][3]}$</span>
                  <i class='bx bx-shopping-bag add-cart' id="${i}" onclick="returnKey(${i})"></i>
                  </div>
                </div>
          `;
  }
  shopContainer.innerHTML = output;
};

2. 重写returnKey函数,仅处理单个商品

修改函数接收索引参数,直接获取对应商品信息添加到购物车,不再遍历全部存储内容:

function returnKey(index) {
  // 直接从数组获取对应商品(也可从localStorage读取)
  const completeProduct = productArray[index];

  // 创建商品元素容器
  const cartItem = document.createElement("div");
  
  // 创建商品各元素
  let cartPrice = document.createElement("p");
  let cartTitle = document.createElement("p");
  let cartImage = document.createElement("img");
  
  // 设置元素属性和内容
  cartTitle.className = "cart-title";
  cartImage.src = completeProduct[2];
  cartImage.width = 75;
  cartImage.height = 75;
  cartTitle.textContent = completeProduct[0];
  cartPrice.textContent = `$${completeProduct[3]}`;

  // 组装元素并添加到购物车
  cartItem.appendChild(cartImage);
  cartItem.appendChild(cartTitle);
  cartItem.appendChild(cartPrice);
  inputCart.appendChild(cartItem);
};

3. 移除错误覆盖代码

删除原函数里的inputCart.innerHTML = cartTitle;,这行代码会清空购物车仅保留最后一个商品标题。

4. 可选:用商品ID替代数组索引(更稳定)

如果担心数组顺序变化导致索引失效,可以用商品ID作为标识:

// 生成按钮时用商品ID作为参数
output += `
  <i class='bx bx-shopping-bag add-cart' id="${data[i].id}" onclick="returnKey(${data[i].id})"></i>
`;

// 修改returnKey函数通过ID获取商品
function returnKey(productId) {
  const completeProduct = JSON.parse(localStorage.getItem(productId));
  // 后续元素创建逻辑同上
}

修改完成后,点击单个商品的购买按钮就只会添加该商品到购物车,不会再出现一次性添加全部商品的问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 15:45:47