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;
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);
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]) {
if (str === "name") continue;
var td = document.createElement("td");
if (str === "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") {
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") {
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.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) {
var item = document.createElement("th");
item.textContent = text;
parent.appendChild(item);
return item;
},
changeNum: function (e) {
if (this.textContent === "+") {
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 === "-") {
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)) {
this.parentNode.data[this.parentNode.index].num = 1;
} else if (Number(this.value) > 99) {
this.parentNode.data[this.parentNode.index].num = 99;
} else if (Number(this.value) < 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;
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;