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,
          num: 1,
          sum: 0,
          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;

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM