#今日说码栏目# 第二十七集 JS实现购物车模块


1、HTML和CSS部分

使用到一般常用的div、input按钮、button按钮、ul列表、

<!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">
  <title>购物车</title>
  <style>
    * {
      padding: 0;
      margin: 0;
      text-decoration: none;
      list-style-type: none;
    }

    body {
      background-image: linear-gradient(to top, #fbc2eb 0%, #a6c1ee 100%);
      background-repeat: no-repeat;
    }

    .shop_container {
      position: relative;
    }

    .select_container {
      width: 80%;
      height: 80px;
      margin: 0 auto;
      background-color: white;
      margin-top: 20px;
      line-height: 80px;
    }

    .select_container>input {
      width: 400px;
      height: 40px;
      padding-left: 20px;
      outline: none;
    }

    input {
      border-radius: 7px;
    }

    .btn {
      height: 40px;
      background-color: #a59e9e;
      width: 130px;
      cursor: pointer;
      border: none;
      border-radius: 7px;
    }

    .btn:hover {
      background-color: #a6c1ee;
    }

    .btn:active {
      background-color: #fbc2eb;
    }

    label {
      padding-left: 10px;
    }

    .check_container,
    .check_container1 {
      width: 80%;
      margin: 0 auto;
      background-color: white;
    }

    .check_container1 {
      margin-top: 20px;
    }

    ul {
      display: flex;
      justify-content: space-around;
      align-items: center;
      padding: 20px;
      border-bottom: 1px solid #CCCCCC;
    }

    ul>li {
      display: inline-block;
      width: 300px;
      padding-left: 40px;
    }

    .aggregate_container {
      width: 80%;
      height: 60px;
      margin: 0 auto;
      background-color: white;
      margin-top: 20px;
      line-height: 60px;
    }

    .aggregate_container>div {
      padding-left: 10px;
    }

    .aggregate_container span {
      color: red;
    }

    .aggregate_container a {
      padding-left: 10px;
      color: rgb(134, 134, 243);
    }
  </style>
</head>

<body>
  <div class="shop_container">
    <div class="select_container">
      <label for="">商品名称:</label>
      <input type="text" name="" id="shopname">

      <label for="">商品价格:</label>
      <input type="text" name="" id="shopprice">

      <button class="btn">加入购物车</button>
    </div>
    <div>
      <div class="check_container1">
        <ul>
          <li><input type="checkbox" class="selectAll"><span>全选按钮</span></li>
          <li>商品名称</li>
          <li>商品价格</li>
          <li>数量</li>
          <li>操作</li>
        </ul>
      </div>
      <div class="check_container">
      </div>
    </div>
    <div class="aggregate_container">
      <div>总共<span class="count">0</span>件商品,共计<span class="sumprice">0</span>元<a href="javaScript:;"
          class="delAll">清空购物车的商品</a>
      </div>
    </div>
  </div>
  <script src="./cart.js"></script>
</body>
</html>

2、JS模块

①获取各元素

 goods = [];  //  商品数组
    //  获得各元素
    itembox = document.querySelector(".check_container");
    btn = document.querySelector(".btn");
    selectAll = document.querySelector(".selectAll");
    count = document.querySelector(".count");
    sumprice = document.querySelector(".sumprice");
    delAll = document.querySelector(".delAll");

②添加商品事件

 //  添加商品事件
    constructor( ) {
        if (localStorage.getItem("goods")) {
            this.goods = JSON.parse(localStorage.getItem("goods"));
        }
         this.render( );
         this.addEvent( );
    }

③所有的监听事件(将所有的监听事件都放在addEvent()方法中)

//  所有的监听事件
    addEvent( ) {
        let this_ = this;

④添加新的购物车商品

  //   添加新的购物车商品
        this.btn.addEventListener("click", function (e) {
            let title = document.getElementById("shopname").value;
            let price = document.getElementById("shopprice").value;
            this_.addgoods({ title: title, price: price });
        })

⑤删除功能

 this.itembox.addEventListener("click", function (e) {
    //  删除功能
            if (e.target.name == "del") {
                let id = e.target.parentNode.parentNode.children[0].children[0].id;
                this_.delGoods(id);
            }

⑥点击框改变

 //   点击框改变
            if (e.target.name == "cekbox") {
                let id = e.target.parentNode.parentNode.children[0].children[0].id;
                this_.upDateGoods(id, "checked", e.target.checked);
                this_.isSelectAll();
            }
            if (e.target.name == 'del1' || e.target.name == 'add') {
                let id = e.target.parentNode.parentNode.children[0].children[0].id;
                this_.changeNum(e.target.name, id);
            }
        })

⑦全选按钮事件

//全选按钮事件
        this.selectAll.addEventListener("click", function () {
            this_.selectAllGoods(this.checked);
        })

⑧删除所有选择

 //删除所有选择
        this.delAll.addEventListener("click", function () {
            this_.goods = [];
            this_.render();
        })
        this.render()
    }

⑨添加商品函数

//添加商品函数
    addgoods(obj) {
        obj.id = Math.floor(Math.random() * 10).toString() + Math.floor(Math.random() * 10).toString() + Math.floor(Math.random() * 10).toString() + Math.floor(Math.random() * 10).toString();
        obj.num = 1;
        obj.checked = false;
        this.goods.push(obj);
        this.render()
    }

⑩删除商品函数

// 删除商品函数
    delGoods(id) {
        for (let i = 0; i < this.goods.length; i++) {
            if (this.goods[i].id == id) {
                this.goods.splice(i, 1);
            }
        }
        this.render();
    }

⑪更新数据

 // 更新数据
    upDateGoods(id, k, v) {
        for (let i = 0; i < this.goods.length; i++) {
            if (this.goods[i].id == id) {
                this.goods[i][k] = v;
            }
        }
        this.render();
    }

⑫全选按钮状态

// 全选按钮状态
    selectAllGoods(checked) {
        for (let i = 0; i < this.goods.length; i++) {
            this.goods[i].checked = checked;
        }
        this.render();
    }

⑬是否全选

// 是否全选
    isSelectAll( ) {
        let flag = true;
        for (let i = 0; i < this.goods.length; i++) {
            if (this.goods[i].checked == false) {
                flag = false;
            }
        }
        this.selectAll.checked = flag;
        this.render();
    }

⑭改变商品数字

// 改变商品的数字
    changeNum(type, id) {
        for (let i = 0; i < this.goods.length; i++) {
            if (this.goods[i].id == id) {
                if (type == 'add') {
                    this.goods[i].num++;
                } else {
                    this.goods[i].num--;
                    this.goods[i].num = this.goods[i].num > 0 ? this.goods[i].num : 1;
                }
            }
        }
        this.render();
    }

⑮渲染itembox

 // 渲染itembox
    render( ) {
        let str = "";
        for (let i = 0; i < this.goods.length; i++) {
            str += `
            <ul class="item">
            <li><input type="checkbox" class="checkitem" id="${this.goods[i].id}"  ${this.goods[i].checked ? "checked" : ""} name = "cekbox"></li>
            <li>${this.goods[i].title}</li>
            <li>${this.goods[i].price}元</li>
            <li><a href="javaScript:;" name="del1"> - </a> <input type="text" name="" id="" value="${this.goods[i].num}" style="width: 50px;"><a href="javaScript:;" name="add">+</a></li>
            <li><a href="javaScript:;" class="del" name="del">删除</a></li>
            </ul>`
        }
        this.itembox.innerHTML = str;
        this.changeButtom( );
        localStorage.setItem("goods", JSON.stringify(this.goods));
    }

⑯更改价格和数量

 // 更改价格和数量
    changeButtom( ) {
        this.count.innerText = this.goods.length;
        let amount = 0;
        for (let i = 0; i < this.goods.length; i++) {
            if (this.goods[i].checked) {
                amount = amount + this.goods[i].num * this.goods[i].price;
            }
        }
        this.sumprice.innerText = amount;
    }
  }

最后一步调用函数Cart()

let c1 = new Cart( );

  • 4
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值