【问题标题】:The items in the DOM are added multiple timesDOM中的项目被多次添加
【发布时间】:2021-09-16 07:00:59
【问题描述】:

我遇到了一个问题,每次我添加元素时,它都会自行相乘(例如,如果购物车中有 1 个元素,下次点击它会再添加 2 个元素,如果有 3 个元素,它会添加多3个,6个就加4个),这是个大问题,请帮忙!

我的js代码:

let pList = document.getElementById("productList");

const addDrip = () => {
  let Drip, localObj, tObj;
  Drip = {
    name: "Traditional Drip",
    type: "normal",
    price: "2.00",
    imgSrc: "images/c5.png"
  };
  localObj = localStorage.getItem("Drip");

   if(!localObj) tObj = [];
   else tObj = JSON.parse(localObj);
   
  tObj.push(Drip)
  localStorage.setItem("Drip", JSON.stringify(tObj));
  
  for(let i = 0;i < tObj.length;i++){
    
    let htmlDrip = `
     <div class="productDiv">
     <p>${tObj[i].name}</p> 
     <p>${tObj[i].type}</p>
     <p>${tObj[i].price}$</p>
     <img src="${tObj[i].imgSrc}">
     </div>
     `
    document.getElementById("productList").innerHTML += htmlDrip;
  }
}

我的html部分:

<div class="cList">
      <img src="images/c5.png"class = "tDrip">
      <h1 class="Type">Traditional Drip</h1>
      <button id="tAdd"onclick="addDrip()">Add Traditional Drip</button>

    </div>

    <div id = productList></div>

【问题讨论】:

  • 您能否提供一个工作环境,让我可以测试这个东西,因为不清楚 tObj 实际持有什么以及阵列实际发生了什么。
  • 那是因为您在 for 循环中更新了 productListinnerHTML。您可以在 for 循环之前清除 productListinnerHTML

标签: javascript arrays dom local-storage e-commerce


【解决方案1】:

在添加新项目时,您实际上不需要遍历数组。 您可以先从localStorage获取物品

HTML:

<div class="cList">
    <img src="images/c5.png" class="tDrip">
    <h1 class="Type">Traditional Drip</h1>
    <button id="tAdd" onclick="addDrip()">Add Traditional Drip</button>

</div>

<div id="productList"></div>

脚本:

const pList = document.getElementById("productList");
let localObj = JSON.parse(localStorage.getItem("Drip"));

const parseItems = () => {

    if (!localObj) localObj = [];
    for (let i = 0; i < localObj.length; i++) {
        let htmlDrip = `
            <div class="productDiv">
                <p>${localObj[i].name}</p> 
                <p>${localObj[i].type}</p>
                <p>${localObj[i].price}$</p>
                <img src="${localObj[i].imgSrc}">
            </div>
            `;
        pList.innerHTML += htmlDrip;
    }
}

parseItems();


const addDrip = () => {
    let Drip;
    Drip = {
        name: "Traditional Drip",
        type: "normal",
        price: "2.00",
        imgSrc: "images/c5.png"
    };

    if (!localObj) localObj = [];
    localObj.push(Drip);
    localStorage.setItem("Drip", JSON.stringify(localObj));

    let htmlDrip = `
            <div class="productDiv">
                <p>${Drip.name}</p> 
                <p>${Drip.type}</p>
                <p>${Drip.price}$</p>
                <img src="${Drip.imgSrc}">
            </div>
            `;

    pList.innerHTML += htmlDrip;
}

【讨论】:

    【解决方案2】:

    这是因为您的阵列已经从本地存储中获得了点滴更新 只需用这个替换你的 JS 代码,它就会按照你想要的方式工作。

    let pList = document.getElementById("productList");
    
    const addDrip = () => {
      let Drip, localObj, tObj;
      Drip = {
        name: "Traditional Drip",
        type: "normal",
        price: "2.00",
        imgSrc: "images/c5.png"
      };
      localObj = localStorage.getItem("Drip");
    console.log(localObj,"Local object")
       if(!localObj) {
       tObj = [];
         tObj.push(Drip)
       }else {
       tObj = JSON.parse(localObj);
       console.log(tObj,"T object")
       }
      localStorage.setItem("Drip", JSON.stringify(tObj));
      
      for(let i = 0;i < tObj.length;i++){
        
        let htmlDrip = `
         <div class="productDiv">
         <p>${tObj[i].name}</p> 
         <p>${tObj[i].type}</p>
         <p>${tObj[i].price}$</p>
         <img src="${tObj[i].imgSrc}">
         </div>
         `
        document.getElementById("productList").innerHTML += htmlDrip;
      }
    }
    

    你只需要在你的数组为空时推送。试一试,它会起作用的。

    注意:您也可以查看演示。如果刷新,只需清除本地存储。https://www.w3schools.com/code/tryit.asp?filename=GS7FA0970MF3

    【讨论】:

    • 在这种情况下,所需的部分可以工作,但它只将元素推送到本地存储一次,这是新问题
    • 我可以看到每次单击按钮时 localstorage 都会用另一个滴水进行更新。这是什么问题。?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-28
    • 2013-07-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多