这次的效果如下图:

实现的效果是在购物车界面选择想要选购的商品,提交后转到支付界面确认支付,最后支付成功后返回选购页面。

我们这篇文章只讲解选购的页面,支付界面见这篇文章:https://xinxin-l.github.io/2022/02/15/%E3%80%90javaScript%E6%A1%88%E4%BE%8B%E3%80%91%E4%B9%8B%E6%94%AF%E4%BB%9810%E7%A7%92%E5%80%92%E8%AE%A1%E6%97%B6/

我们开始咯~

我们首先来实现html和css的部分:如下图

其实这个部分很考验基础功~,我们需要用到table标签,在td中写入对应的文字(具体可见下方的代码,可以根据自己的喜好添加样式)。

重点其实在于js的部分:

这个效果实现的基本功能如下:

  1. 勾选/不勾选第一列的框,对应第五列的小计中的价格会改变,下方的合计价格会改变
  2. 选择第一行第一列的全选按钮,下方所有的复选框都会被选中,对应的小计和合计中的价格都会发生改变
  3. 选择第四列中的-和+,表示要选购该物品的数目,相应的小计和合计中的价格会发生改变
  4. 点击最后一列的删除键,相应的行会消失,同时合计数目会发生改变

要从哪下手呢,我们按照顺序来解决~

  1. 我们首先通过document.getElementsByTagName获取所有的复选框,然后通过onclick函数修改其checked属性,表示选中/不选中。要记住必须要通过一个变量来表示是从选中->未选中,还是未选中->选中。然后如何修改其内容呢? 我们可以通过parentNode来选出复选框对应的父节点,再在该父节点中选出对应小计中的innerText,修改其内容(要对应前面的单价)=======这样第一点就完成啦,其实还要多研究细节,有很多需要在注意的细节
  2. 关于全选实现的效果,我们可以和复选框修改内容使用部分相同的代码,(具体可见下面的代码),要记住我们还是需要记录一个变量来判断复选框是否被全选->判断对应的价格是否要发生变化。
  3. 关于通过加减来修改选购物品的数目,需要多加思考,因为涉及选购数目、小计价格、总计价格的改变,但是大概的思路跟第一点类似,就是通过该节点找到其父节点,然后修改该父节点下的不同子节点的innerText(但是在修改之前要判断一下对应的复选框是否被选中,若未被选中,就不需要改变相关价格了~)
  4. 最后一点,其实就简单啦,点击删除按钮的时候,我们需要修改的只有两点:一是display:none,二是如果复选框被选中,需要修改对应的合计的价格

好啦,大概思路就是以上几点啦,具体内容可以参考下面的代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
<!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>Document</title>
<style>
*{
margin:0;
padding: 0;
}

table{
/* border:1px solid rgba(0,0,0,.3); */
text-align: center;
margin:60px auto;
margin-bottom: 20px;
width:500px;
border-radius: 20px;
border-spacing: 2px;
}

table td{
border:2px solid rgba(0,0,0,.3);
margin:0;
width: 70px;
height:60px;
border-radius: 20px;
box-shadow: 2px 3px 2px rgba(0,0,0,.3);
}

#hd td{
font-weight:560;
}

tr :nth-child(6){
cursor: pointer;
}

#bott{
text-align: right;
width: 450px;
margin: 30px auto;
font-size:23px;
}

#btn{
width: 50px;
}

table td input{
width: 16px;
height: 16px;
}

.f,.z{
margin: 0 5px;
width: 17px;
}

table td,table button{
background-color: rgba(135, 207, 235, 0.56);
}

#sub{
width: 70px;
height: 35px;
margin-left: 60px;
}
</style>
</head>
<body>
<table>
<tr id="hd">
<td><button id="btn" style="background-color: snow;">全选</button></td>
<td>商品名称</td>
<td>单价</td>
<td>数量</td>
<td>小计</td>
<td style="cursor: auto;">操作</td>
</tr>
<tr>
<td><input type="checkbox" name="" id="a"></td><td>巧克力</td><td>200</td><td><button class="f">-</button><span>1</span><button class="z">+</button></td><td>200</td><td class="del">删除</td>
</tr>
<tr>
<td><input type="checkbox" name="" id="b"></td><td>奥利奥</td><td>100</td><td><button class="f">-</button><span>2</span><button class="z">+</button></td><td>200</td><td class="del">删除</td>
</tr>
<tr>
<td><input type="checkbox" name="" id="c"></td><td>薯片</td><td>50</td><td><button class="f">-</button><span>2</span><button class="z">+</button></td><td>100</td><td class="del">删除</td>
</tr>
<tr>
<td><input type="checkbox" name="" id="c"></td><td>奶茶</td><td>20</td><td><button class="f">-</button><span>2</span><button class="z">+</button></td><td>40</td><td class="del">删除</td>
</tr>
</table>
<div id="bott">
<span>总计:</span>
<span id="total"></span>
<button type="submit" id="sub">提交</button>
</div>
<script>
let btns=document.getElementsByTagName("input");
let total=document.getElementById("total");
let f=document.getElementsByClassName("f");
let z=document.getElementsByClassName("z");
let del=document.getElementsByClassName("del");
let sub=document.getElementById("sub");

document.getElementById("btn").onclick=function(){
let tem=true;
for(let i=0;i<btns.length;i++){
let before=btns[i].checked;
if(before===false){
tem=false;
}
btns[i].checked=true;
click(i,before);
}
if(tem){
total.innerText=0;
for(let i=0;i<btns.length;i++){
btns[i].checked=false;
}
}
}

total.innerText=0;
for(let i=0;i<btns.length;i++){
let before=btns[i].checked;
btns[i].onclick=function(){
if(btns[i].checked===false){
before=true;
}
if(btns[i].checked===true){
before=false;
}
click(i,before);
}
}

function click(i,before){
console.log(btns[i].checked);
console.log(before)
let par=btns[i].parentNode.parentNode;
let price=par.childNodes[5].innerText;
console.log(price)
if(btns[i].checked === true && before === false && par.style.display!=="none"){
total.innerText = parseInt(total.innerText)+parseInt(price);
}
if(btns[i].checked === false && before === true && par.style.display!=="none"){
total.innerText = parseInt(total.innerText)-parseInt(price);
}
}

for(let i=0;i<f.length;i++){
f[i].onclick=function(){
let num=Math.abs(parseInt(f[i].parentNode.innerText));
let par=f[i].parentNode.parentNode;
let little=parseInt(par.childNodes[5].innerText);
let single=parseInt(par.childNodes[3].innerText);

if(num > 0){
num--;
f[i].parentNode.childNodes[1].innerText=num;
par.childNodes[5].innerText=little-single;
if(btns[i].checked===true){
total.innerText = parseInt(total.innerText)-single;
}
}
}

z[i].onclick=function(){
let num=Math.abs(parseInt(f[i].parentNode.innerText));
let par=f[i].parentNode.parentNode;
let little=parseInt(par.childNodes[5].innerText);
let single=parseInt(par.childNodes[3].innerText);
num++;
f[i].parentNode.childNodes[1].innerText=num;
par.childNodes[5].innerText=little+single;
if(btns[i].checked===true){
total.innerText = parseInt(total.innerText)+single;
}
}
}

for(let i=0;i<del.length;i++){
del[i].onclick=function(){
let par=del[i].parentNode;
par.style.display="none";
if(btns[i].checked===true){
total.innerText = parseInt(total.innerText) - parseInt(par.childNodes[5].innerText);
}
}
}

sub.onclick=function(){
alert("总消费"+total.innerText+"元,确定要支付吗?");
for(let i=0;i<btns.length;i++){
btns[i].checked=false;
}
total.innerText=0;
location.href="../特效/支付10秒钟.html";
}


</script>
</body>
</html>