JS案例:购物车操作简单实现

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>shop</title>
    <link rel="stylesheet" href="css/shop.css">
  </head>

  <body>
    <script src="js/shop.js"></script>
    <script>
      // 新建数据
      var obj = [
        {
          select: false,img:"img/1.jpg",//图片路径
          name: "OPPO R11 全网通4G 双卡双待手机玫瑰金色",price: 2799,num: 1,sum: 0,del: false
        },{
          select: false,img:"img/2.jpg",//图片路径
          name: "Apple iPhone8 64G 金色 移动联通电信4G手机",price: 5888,del: false
        }
      ];
      // 实例化对象,传入数据
      var table = new Table(obj);
    </script>
  </body>
</html>

Css:

*{
    margin: 0;
    padding: 0;
}
table{
    width: 1200px;
    /* background: lightcoral; */
    margin: 50px auto;
}
tr:nth-child(1){
    background: #F3F3F3;
    height: 26px;
}
img{
    height: 30%;
    vertical-align: middle;
}
img+span{
    font-size: 10px;
}
td{
    text-align: center;
    vertical-align: middle;
}
tr td:nth-child(2){
    text-align: left;
}
tr td:nth-child(4) div button{
    height: 20px;
    width: 20px;
    border: none;
    text-align: center;
    vertical-align: middle;
}
tr td:nth-child(4) div input{
    height: 20px;
    width: 27px;
    vertical-align: middle;
}
tr td:nth-child(3),tr td:nth-child(5){
    width: 100px;
}
table>div{
    width: 300px;
    text-align: right;
}

JS:

function Table(obj) {
  this.obj = obj; //引入数组对象
  this.init(obj); //入口函数
}
Table.prototype = {
  table: null,//初始化表格
  allSum: 0,//商品总和
  allNum: 0,//商品数量总和
  allselect: false,//全选
  init: function (obj) {
    this.createTab(obj); //创建表格
  },createTab: function (obj) {
    if (this.table) { //初始化表格,若表格存在,则删除表格再新建
      this.table.remove();
      this.table = null;
    }
    this.table = document.createElement("table"); //创建表格
    var thr = document.createElement("tr"); //创建表格标题
    var selectAll = document.createElement("th");
    var selectAllInput = document.createElement("input"); //全选
    selectAllInput.self = this;
    selectAllInput.addEventListener("change",this.selectHandler); //添加事件,当全选建改变时触发
    selectAllInput.type = "checkbox";
    selectAllInput.checked = this.allselect; //给其选中添加值,让数据驱动更改选中状态
    selectAll.textContent = "全选";
    selectAll.appendChild(selectAllInput);
    thr.appendChild(selectAll); //createName方法添加表头内容
    this.createName("商品",thr);
    this.createName("单价",thr);
    this.createName("数量",thr);
    this.createName("小计",thr);
    this.createName("操作",thr);
    this.table.appendChild(thr);
    for (var i = 0; i < obj.length; i++) { //根据数组对象创建表格
      var tr = document.createElement("tr");
      for (var str in obj[i]) { //跳过name那项(因为里面有两个属性,后面会讲到)
        if (str === "name") continue;
        var td = document.createElement("td");
        if (str === "select") { //当属性名为select时创建多选按钮,添加更改时触发的事件
          var select = document.createElement("input");
          select.type = "checkbox";
          select.self = this;
          select.index = i; //传递当前点击索引
          select.addEventListener("change",this.selectHandler);
          select.checked = obj[i].select; //给其选中添加值,让数据驱动更改选中状态
          td.appendChild(select);
        } else if (str === "img") { //当属性名为img时创建图片以及商品名
          var img = new Image();
          img.src = obj[i][str];
          var name = document.createElement("span");
          name.textContent = obj[i].name;
          td.appendChild(img);
          td.appendChild(name);
        } else if (str === "price") { //当属性名为price时创建价格,同样数据驱动
          td.price = obj[i][str];
          td.textContent = td.price;
        } else if (str === "num") { //数据驱动商品的个数
          var num = document.createElement("div");
          num.index = i;
          num.data = obj; //将数据赋给num(后面会用到)
          num.self = this;
          //创建-和+按钮,以及文本框,改变商品个数
          var left = document.createElement("button");
          var text = document.createElement("input");
          var right = document.createElement("button");
          left.textContent = "-";
          right.textContent = "+";
          text.value = obj[i].num;
          //添加事件,当点击+或-时触发事件,当文本框中失焦触发另一个事件
          left.addEventListener("click",this.changeNum);
          text.addEventListener("blur",this.changeNum);
          right.addEventListener("click",this.changeNum);
          num.appendChild(left);
          num.appendChild(text);
          num.appendChild(right);
          td.appendChild(num);
        } else if (str === "sum") { //新建单商品的总价(个数乘以单价)
          var sum = document.createElement("div");
          sum.data = obj[i]; //将该商品的数据传递
          sum.textContent = obj[i].num * obj[i].price;
          td.appendChild(sum);
        } else if (str === "del") { //新建删除按钮
          var del = document.createElement("button");
          del.textContent = "Del";
          del.data = obj; //将该商品的数据传递
          del.index = i; //该项的索引通过事件传递
          del.self = this;
          del.addEventListener("click",this.delHandler); //删除事件
          td.appendChild(del);
        }
        tr.appendChild(td);
      }
      this.table.appendChild(tr);
    }
    this.addAll(obj,this.table); //根据更新的表格数据新建商品总价及总个数
    document.body.appendChild(this.table);
    return this.table;
  },addAll: function (obj,parent) { //商品总价及总个数
    var addAllItem = document.createElement("div");
    var addAllPrice = document.createElement("div");
    var sum = 0; //初始化总价及数量
    var price = 0;
    for (var i = 0; i < obj.length; i++) {
      sum += obj[i].num;
      price += obj[i].price * obj[i].num; //求总价和总和
    }
    addAllItem.textContent = "总数:" + sum;
    addAllPrice.textContent = "总价:" + price;
    parent.appendChild(addAllItem);
    parent.appendChild(addAllPrice);
  },createName: function (text,parent) { //createName方法添加表头内容
    var item = document.createElement("th");
    item.textContent = text;
    parent.appendChild(item);
    return item;
  },changeNum: function (e) {
    if (this.textContent === "+") { //当点击+按钮使数组对象中的商品数加一,当商品数量大于99就不再增加
      this.parentNode.data[this.parentNode.index].num++;
      if (this.parentNode.data[this.parentNode.index].num > 99) {
        this.parentNode.data[this.parentNode.index].num = 99;
      }
    } else if (this.textContent === "-") { //当点击-按钮使数组对象中的商品数减一,当商品数量小于0就不再减少
      this.parentNode.data[this.parentNode.index].num--;
      if (this.parentNode.data[this.parentNode.index].num < 1) {
        this.parentNode.data[this.parentNode.index].num = 1;
      }
    } else { //当在文本框输入个数时对数组对象中的商品数进行操作
      if (isNaN(this.value)) { //当输入的不为数值时,使其变成1
        this.parentNode.data[this.parentNode.index].num = 1;
      } else if (Number(this.value) > 99) { //当输入的大于99时,使其变成99
        this.parentNode.data[this.parentNode.index].num = 99;
      } else if (Number(this.value) < 1) { //当输入的小于1时,使其变成1
        this.parentNode.data[this.parentNode.index].num = 1;
      } else { //否则直接让对象中的数值等于输入的值
        this.parentNode.data[this.parentNode.index].num = Number(this.value);
      }
    }
    this.parentNode.self.init(this.parentNode.data); //根据更改后的数据驱动创建表格
  },delHandler: function (e) {
    this.data.splice(this.index,1); //删除当前选择的那项,根据更改后的数据驱动创建表格
    this.self.init(this.data);
  },selectHandler: function (e) { //全选时使所有的单选框都根据数据更改
    if (this.parentNode.textContent === "全选") {
      this.self.allselect = !this.self.allselect;
      for (var i = 0; i < this.self.obj.length; i++) {
        this.self.obj[i].select = this.self.allselect;
      }
    } else {
      var sum = 1; //当所有的单选框选中的值为true时,将全选选中(true是1,false是0)
      this.self.obj[this.index].select = !this.self.obj[this.index].select;
      for (var i = 0; i < this.self.obj.length; i++) {
        sum *= this.self.obj[i].select;
      }
      if (sum) {
        this.self.allselect = true;
      } else {
        this.self.allselect = false;
      }
    }
    this.self.init(this.self.obj); //根据更改后的数据驱动创建表格
    console.log(this.checked);
  }
};
Table.prototype.constructor = Table;

 

原文地址:https://blog.csdn.net/time_____

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


kindeditor4.x代码高亮功能默认使用的是prettify插件,prettify是Google提供的一款源代码语法高亮着色器,它提供一种简单的形式来着色HTML页面上的程序代码,实现方式如下: 首先在编辑器里面插入javascript代码: 确定后会在编辑器插入这样的代码: <pre
这一篇我将介绍如何让kindeditor4.x整合SyntaxHighlighter代码高亮,因为SyntaxHighlighter的应用非常广泛,所以将kindeditor默认的prettify替换为SyntaxHighlighter代码高亮插件 上一篇“让kindeditor显示高亮代码”中已经
js如何实现弹出form提交表单?(图文+视频)
js怎么获取复选框选中的值
js如何实现倒计时跳转页面
如何用js控制图片放大缩小
JS怎么获取当前时间戳
JS如何判断对象是否为数组
JS怎么获取图片当前宽高
JS对象如何转为json格式字符串
JS怎么获取图片原始宽高
怎么在click事件中调用多个js函数
js如何往数组中添加新元素
js如何拆分字符串
JS怎么对数组内元素进行求和
JS如何判断屏幕大小
js怎么解析json数据
js如何实时获取浏览器窗口大小
原生JS实现别踩白块小游戏(五)
原生JS实现别踩白块小游戏(一)