购物车

作者: lacduang | 来源:发表于2019-08-27 00:27 被阅读0次
<script>
/**
1、全选功能
  每一行都会别选中
  每行的小计价格会汇总加到一起放入总价
2、单选功能
  这一行会被选中或者取消选中
  将购物车内被选中的行的小计价格汇总加到一起放入总计
  判断是否是被全选了(全选按钮是否该被选中)
3、数量加减按钮(一)
  这一行被选中
  数量进行添加或者减少(最少为1)
  计算这一行的小计价格
  将购物车内被选中的行的小计价格汇总加到一起放入总计
4、手动修改数量
  这一行被选中
  计算这一行的小计价格
  将购物车内被选中的行的小计价格汇总加到一起放入总计
5、删除按钮
  这一行会被移掉
  将购物车内被选中的行的小计价格汇总加到一起放入总计
6、删除被选中的商品
  被选中的商品会被删除
  购物车内总计价格为0
*/
</script>

<script>
  // 找到 DOM 节点
  var add = document.querySelectorAll('.Increase')   // 所有的加按钮
  var reduce = document.querySelectorAll('.Reduce')  // 所有的减按钮
  var numIpt = document.querySelectorAll('.unm')   // 找到所有数量输入框
  var rows = document.querySelectorAll('.row')      // 找到所有的行
  var choose = document.querySelectorAll('.choose')  // 找到所有单选框
  var chooseAll = document.querySelectorAll('choose_all')  // 找到所有的全选按钮
  var btnDel = document.querySelectorAll('.btn-del')    // 找到所有的删除按钮
  var delCheck = document.querySelector('.del-check')   // 删除被选中
 
  // 数量添加事件 1
  for(var i = 0; i < add.length; i++) {
    add[i].onclick = function() {
      numChange(this, 'add')         // this指向当前被点击的节点
    }
  }

  // 数量减少事件 2
  for(var i = 0; i < reduce.length; i++) {
    reduce[i].onclick = function() {
      numChange(this, 'reduce')
    }
  }

  // 手动修改数量 3
  for(var i = 0; i < numIpt; i++) {
    // 输入完之后
    numIpt[i].onblur = function() {
      if(this.value < 1) {   // 数量不可以少于1
        this.value = 1
      }
      this.value = parseInt(this.value)   // 保证数量是整数
      numChange(this, 'cursor')
    }
  }

  // 单选框点击事件  5
  for(var i = 0; i < choose.length; i++) {
    choose[i].onclick = function() {
      getTotal()   // 计算总价
    }
  }

  // 全选 6
  for(var i = 0; i < chooseAll.length; i++) {
    chooseAll[i].onclick = function() {
      for(var i = 0; i < rows.length; i++) {
        var check = rows[i].querySelector('.choose')   // 找到每行的选中框
        check.checked = this.checked
      }
      chooseAll[0].checked = chooseAll[1].checked = this.checked
      getTotal()
    }
  }
  
  //  删除这一行  7 
  for(var i = 0; i < btnDel.length; i++) {
    btnDel[i].onclick = function(event) {
      event.preventDefault();
      var tr = this.parentNode.parentNode
      tr.parentNode.removeChild(tr)
      getTotal()
    }
  }

  // 删除被选中的商品
  delCheck.onclick = function() {
    rows = document.querySelectorAll('.row')
    for(var i = 0; i < rows.length; i++) {
      // 找到被选中的行
      var check = rows[i].querySelector('.choose')   // 找到每行的选中框
      if(check.checked) {
        rows[i].parentNode.removeChild(rows[i])
      }
    }
    getTotal()
  }

  // 总计功能 4
  function getTotal() {
    // 1、设置总价
    var total = 0

    // 遍历所有行
    rows = document.querySelectorAll('.row')
    for(var i = 0; i < rows.length; i++) {
      // 找到被选中的行
      var check = rows[i].querySelector('.choose')   // 找到每行的选中框
      if(check.checked) {
        var smTot = rows[i].querySelector('.u-price').innerHTML
        smTot = Number(smTot)
        total = total + smTot
      }
    }

    var tPrice = document.querySelector('.t-price')
    tPrice.innerHTML = total.toFixed(2)

    // 2. 判断是否全选
    var isAllCheck = true    // 
    for(var i = 0; i < rows.length; i++) {
      var check = rows[i].querySelector('.choose')   // 找到每行的选中框
      if(!check.checked) {    // 一旦有没有被选中的
        isAllCheck = false
        break                   // 
      }
      if(rows.length) {
        isAllCheck = false
      }
    }
    chooseAll[0].checked = isAllCheck
    chooseAll[1].checked = isAllCheck

    // 3. 计算总商品个数
    var allNum = 0
    for(var i = 0; i < rows.length; i++) {
      // 找到被选中的行
      var check = rows[i].querySelector('.choose')   // 找到每行的选中框
      if(check.checked) {
        var smTot = rows[i].querySelector('.unum').value
        smTot = Number(smTot)
        allNum = allNum + smTot
      }
    }
    document.querySelector('.t-number').innerHTML = allNum
  }
  getTotal()
  /**
    数量变化的函数
    {Object} dom 被点击的那个DOM节点
    {String} act 数量添加还是减少还是手动修改
  */
  function numChange(dom, act) {
     // 1. 数量变化
     var amount = dom.parentNode     // 父标签
      var ipt = amount.querySelector('.num')   // 找到数量框
      var num = ipt.value      // 数量

      //
      if(act == 'add') {   // 添加行为
        num++
        ipt.value = num
      } else if(act == 'reduce') {  // 减少行为
        if(num == 1) {
          num = 1      // 数量是一就不变化
        } else {
          num--          // 数量减一
        }
        ipt.value = num
      } else if (act == 'cursor'){
        console.log('手动修改数量')
      } else {   // 非法行为
        return
      }


      // 2. 计算这一行的小计
      var tr = amount.parentNode.parentNode         // 找到当前行
      var unit = tr.querySelector('.unit')      // 价格框

      var price = unit.innerHTML
      var smTotal = num * price             // 小计
      smTotal = smTotal.toFixed(2)       // 保留两位小数
      // 3. 将小计放入到对应的位置
      var smPrice = tr.querySelector('.u-price')     // 小计框
      smPrice.innerHTML = smTotal
      // 4. 这一行被选中
      var choose = tr.querySelector('.choose')
      choose.checked = true
      // 5. 计算总计价格
      getTotal()
  }

</script>

相关文章

  • 商城之购物车

    购物车管理: 包含功能:提交商品到购物车、显示购物车列表、删除购物车里商品、修改购物车、清空购物车等等 1、购...

  • 购物车模块实现

    1、购物车列表功能实现 点击加入购物车或者点击购物车图标后进入购物车页面,在购物车页面中首先渲染cartList的...

  • SSM框架学习日记(6)——购物车模块

    购物车相关接口 添加购物车,购物车列表,更新商品数量,删除购物车先新建CartController和CartSer...

  • 8.5-高并发下的互联网电商购物车实战-加入购物车接口开发—小滴

    高并发下的互联网电商购物车实战-加入购物车接口开发 简介:电商购物车实现案例-加入购物车接口开发 添加购物车接口 ...

  • day11购物车10-细节完善

    购物车01-搭建基本骨架购物车02-圆角按钮处理购物车03-显示数据购物车04-加号减号点击处理购物车05-通知的...

  • day11购物车08-代理的简单实现

    购物车01-搭建基本骨架购物车02-圆角按钮处理购物车03-显示数据购物车04-加号减号点击处理购物车05-通知的...

  • day11-购物车06-清空和购买

    购物车01-搭建基本骨架购物车02-圆角按钮处理购物车03-显示数据购物车04-加号减号点击处理购物车05-通知的...

  • day11购物车07-KVO的应用

    购物车01-搭建基本骨架购物车02-圆角按钮处理购物车03-显示数据购物车04-加号减号点击处理购物车05-通知的...

  • day11购物车09-代理设计模式

    购物车01-搭建基本骨架购物车02-圆角按钮处理购物车03-显示数据购物车04-加号减号点击处理购物车05-通知的...

  • 8.购物车管理

    购物车管理模块是属于用户侧模块,主要有7个接口:添加商品到购物车、更新购物车商品数、移除购物车商品、查看购物车当中...

网友评论

      本文标题:购物车

      本文链接:https://www.haomeiwen.com/subject/apojectx.html