demo-购物车(localstorage)

15 篇文章 0 订阅
3 篇文章 0 订阅

在这里插入图片描述
需要的文件
在这里插入图片描述

cart.js

class Cart {
  constructor() {
    this.cartData = localStorage.getItem("cartData")
      ? JSON.parse(localStorage.getItem("cartData"))
      : {};
  }
  saveData(id, num, terminal) {
    if (!this.cartData[id] || terminal) {
      this.cartData[id] = num;
    } else {
      this.cartData[id] += num;
    }

    localStorage.setItem("cartData", JSON.stringify(this.cartData));
  }
  showList(domobj) {
    this.domobj = domobj;
    let prodDatas = JSON.parse(localStorage.getItem("prodDatas"));
    let cartData = JSON.parse(localStorage.getItem("cartData"));

    let str = "";
    for (let id in cartData) {
      str += `
      <li data-id="${id}">
      <input type="checkbox" class="ck" />
      <img src="${prodDatas[id].imgsrc}" />
      <span>${prodDatas[id].title}</span>
      <span class="price">${prodDatas[id].price}</span>
      <span class="minus">-</span>
      <input type="text" class="num" value="${cartData[id]}" />
      <span class="plus">+</span>
      <span class="perPrices">${prodDatas[id].price * cartData[id]}</span>
      <span class="del">删除</span>
    </li>
      `;
    }
    domobj.innerHTML = str;
  }
  checkAll(id) {
    let oCheckAll = document.getElementById(id);
    let aCks = document.querySelectorAll(".ck");
    oCheckAll.onclick = () => {
      for (let i = 0; i < aCks.length; i++) {
        aCks[i].checked = oCheckAll.checked;
      }
      this.getTotalPrice("totalPrice");
    };
    for (let i = 0; i < aCks.length; i++) {
      aCks[i].onclick = () => {
        var count = 0;
        for (let j = 0; j < aCks.length; j++) {
          if (aCks[j].checked) {
            count++;
          }
        }
        if (count == aCks.length) {
          oCheckAll.checked = true;
        } else {
          oCheckAll.checked = false;
        }
        this.getTotalPrice("totalPrice");
      };
    }
  }
  updateData() {
    let _this = this;
    this.aMinus = document.querySelectorAll(".minus");
    this.aPlus = document.querySelectorAll(".plus");
    this.aNums = document.querySelectorAll(".num");
    this.aPrice = document.querySelectorAll(".price");
    this.aPerPrice = document.querySelectorAll(".perPrices");
    this.aCks = document.querySelectorAll(".ck");

    for (let i = 0; i < this.aMinus.length; i++) {
      //减
      this.aMinus[i].onclick = () => {
        let id = this.aMinus[i].parentNode.getAttribute("data-id");
        //console.log(id);
        if (this.aNums[i].value <= 1) {
          this.aNums[i].value = 1;
          return;
        }
        this.aNums[i].value--;

        this.saveData(id, Number(this.aNums[i].value), true);
        getPerPrice(i);
        this.getTotalPrice("totalPrice");
      };
      //加
      this.aPlus[i].onclick = () => {
        let id = this.aPlus[i].parentNode.getAttribute("data-id");
        this.aNums[i].value++;
        this.saveData(id, Number(this.aNums[i].value), true);
        getPerPrice(i);
        this.getTotalPrice("totalPrice");
      };
      //改
      this.aNums[i].onchange = () => {
        let id = this.aNums[i].parentNode.getAttribute("data-id");
        if (this.aNums[i].value <= 1) {
          this.aNums[i].value = 1;
        }
        this.saveData(id, Number(this.aNums[i].value), true);
        getPerPrice(i);
        this.getTotalPrice("totalPrice");
      };
    }

    function getPerPrice(i) {
      _this.aPerPrice[i].innerText =
        _this.aNums[i].value * _this.aPrice[i].innerText;
    }
  }
  getTotalPrice(id) {
    let oTotalPrice = document.getElementById(id);
    let totalPrice = 0;
    for (let j = 0; j < this.aCks.length; j++) {
      if (this.aCks[j].checked) {
        totalPrice += Number(this.aPerPrice[j].innerText);
      }
    }
    oTotalPrice.innerText = totalPrice;
  }
  removeData() {
    let aDelbtns = document.querySelectorAll(".del");
    for (let i = 0; i < aDelbtns.length; i++) {
      aDelbtns[i].onclick = () => {
        let id = aDelbtns[i].parentNode.getAttribute("data-id");
        this.domobj.removeChild(aDelbtns[i].parentNode);
        delete this.cartData[id];
        localStorage.setItem("cartData", JSON.stringify(this.cartData));
        this.aCks[i].checked = false;
        this.getTotalPrice("totalPrice");
      };
    }
  }
}

prodList.html

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <meta http-equiv="X-UA-Compatible" content="ie=edge" />
    <title>列表页</title>
    <style>
      ul,
      li,
      p {
        padding: 0;
        margin: 0;
      }
      img {
        display: block;
        border: none;
      }
      #prodList li {
        list-style: none;
        float: left;
        margin: 10px;
        width: 220px;
        padding: 10px;
        border: 1px solid #cecece;
      }
      #prodList li p {
        margin: 10px 0;
      }
      #prodList li input {
        border: none;
        width: 120px;
        height: 40px;
        background-color: red;
        color: white;
      }
    </style>
  </head>
  <body>
    <div>
      <ul id="prodList"></ul>
    </div>
    <script src="cart.js"></script>
    <script>
      /* let data = { a: 1, b: 2 };
      localStorage.setItem("username", "duanfanchao");
      localStorage.setItem("data", JSON.stringify(data));
      console.log(JSON.parse(localStorage.getItem("data")));
      localStorage.removeItem("username"); */

      /* let productDatas = {
        "10001": {
          id: 10001,
          title: "商品1",
          price: 100,
          imgsrc: "img/1.jpg",
        },
        "10002": {
          id: 10002,
          title: "商品2",
          price: 200,
          imgsrc: "img/2.jpg",
        },
        "10003": {
          id: 10003,
          title: "商品3",
          price: 300,
          imgsrc: "img/3.jpg",
        },
      };
      localStorage.setItem("prodDatas", JSON.stringify(productDatas)); */
      let oUl = document.getElementById("prodList");
      let prodDatas = JSON.parse(localStorage.getItem("prodDatas"));
      let str = "";
      for (let id in prodDatas) {
        str += ` <li>
         <a href="detail.html?id=${id}"> <img src="${prodDatas[id].imgsrc}" /></a>
          <p>${prodDatas[id].title}</p>
          <p>${prodDatas[id].price}</p>
          <input type="button" class="addBtn" value="加入购物车" data-id="${id}" />
        </li>`;
      }
      oUl.innerHTML = str;

      let cart = new Cart();

      let addBtns = document.querySelectorAll(".addBtn");
      for (let i = 0; i < addBtns.length; i++) {
        addBtns[i].onclick = function () {
          let id = this.getAttribute("data-id");
          cart.saveData(id, 1, false);
        };
      }
    </script>
  </body>
</html>

detail.html

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <meta http-equiv="X-UA-Compatible" content="ie=edge" />
    <title>详情页</title>
  </head>
  <body>
    <div id="detail"></div>
    <script src="cart.js"></script>
    <script>
      let prodDatas = JSON.parse(localStorage.getItem("prodDatas"));
      let id = location.search.split("=")[1];
      let product = prodDatas[id]; //单个商品数据
      let oDetail = document.getElementById("detail");

      oDetail.innerHTML = `<img src="${product.imgsrc}"><p>${product.title}</p><p>${product.price}</p><p><span class="minus">-</span><input type="text" class="txt" value="1"><span class="plus">+</span></p><p><input type="button" class="addBtn" value="加入购物车"></p>`;

      let oMinus = document.querySelectorAll(".minus")[0];
      let oPlus = document.querySelectorAll(".plus")[0];
      let oTxt = document.querySelectorAll(".txt")[0];
      let oBtn = document.querySelectorAll(".addBtn")[0];

      oMinus.onclick = function () {
        if (oTxt.value <= 1) {
          oTxt.value = 1;
          return;
        }
        oTxt.value--;
      };
      oPlus.onclick = function () {
        oTxt.value++;
      };

      let cart = new Cart();
      oBtn.onclick = function () {
        cart.saveData(id, Number(oTxt.value), false);
        location.href = "cart.html";
      };
    </script>
  </body>
</html>

cart.html

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <meta http-equiv="X-UA-Compatible" content="ie=edge" />
    <title>购物车</title>
    <style>
      img {
        width: 30px;
      }
    </style>
  </head>
  <body>
    <div>
      <input type="checkbox" id="checkAll" />
      <ul id="cartList">
        <li>
          <input type="checkbox" class="ck" />
          <img src="" />
          <span>标题</span>
          <span class="price"></span>
          <span class="minus">-</span>
          <input type="text" class="num" />
          <span class="plus">+</span>
          <span class="perPrices"></span>
          <span class="del">删除</span>
        </li>
      </ul>
      <div id="totalPrice">0</div>
    </div>
    <script src="cart.js"></script>
    <script>
      let cart = new Cart();
      let oUl = document.getElementById("cartList");
      cart.showList(oUl);
      cart.checkAll("checkAll");
      cart.updateData();
      cart.removeData();
    </script>
  </body>
</html>

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值