Blogger Information
Blog 37
fans 0
comment 0
visits 14212
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
购物车JS代码
秋闲独醉
Original
367 people have browsed it

  1. <!DOCTYPE html>
  2. <html lang="zh-CN">
  3. <head>
  4. <meta charset="UTF-8" />
  5. <meta http-equiv="X-UA-Compatible" content="IE=edge" />
  6. <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  7. <title>实战3-购物车</title>
  8. <link rel="stylesheet" href="style.css" />
  9. </head>
  10. <body>
  11. <div class="box">
  12. <!-- 1. 全选按钮 -->
  13. <div class="selectAll">
  14. <!-- change: 当它的值发生改变时触发 -->
  15. <!-- checked: 当前是选中状态, 布尔属性 -->
  16. <input type="checkbox" class="check-all" name="check-all" onchange="checkAll()" checked />
  17. <label for="check-all">全选</label>
  18. </div>
  19. <!-- 2. 商品列表 -->
  20. <ul class="list">
  21. <li><span>选择</span><span>品名</span><span>数量</span><span>单价</span><span>金额</span></li>
  22. <li>
  23. <input type="checkbox" onchange="checkItems()" checked />
  24. <span class="content">手机</span>
  25. <input type="number" value="1" min="1" class="num" />
  26. <span class="price">100</span>
  27. <span class="amount">0</span>
  28. </li>
  29. <li>
  30. <input type="checkbox" onchange="checkItems()" checked />
  31. <span class="content">电脑</span>
  32. <input type="number" value="2" min="1" class="num" />
  33. <span class="price">200</span><span class="amount">0</span>
  34. </li>
  35. <li>
  36. <input type="checkbox" onchange="checkItems()" checked />
  37. <span class="content">相机</span>
  38. <input type="number" value="3" min="1" class="num" />
  39. <span class="price">300</span>
  40. <span class="amount">0</span>
  41. </li>
  42. <li>
  43. <span>总计:</span>
  44. <span class="total-num">0</span>
  45. <span class="total-amount">0</span>
  46. </li>
  47. </ul>
  48. <!-- 3. 结算按钮 -->
  49. <button class="account">结算</button>
  50. </div>
  51. <script>
  52. // 1. 选做: 购物车选择或不选商品时,并自动过滤未选商品,自动计算
  53. // (一) 全选的自动设置
  54. // 1. 全选
  55. function checkAll() {
  56. // 第1步: 获取当前按钮的状态
  57. let status = event.target.checked;
  58. // 第2步: 根据当前状态,来动态的设置其它所有商品的选中状态
  59. const items = document.querySelectorAll('.list li input[type="checkbox"]');
  60. // console.log(items);
  61. items.forEach((item) => (item.checked = status));
  62. // document
  63. // .querySelectorAll('.list li input[type="checkbox"]')
  64. // .forEach(item => (item.checked = event.target.checked));
  65. //勾选重新算
  66. chageCalculate();
  67. }
  68. // 2. 根据用户的选择来动态的设置"全选"按钮的状态
  69. // 第1步: 获取全部的商品
  70. const items = document.querySelectorAll('.list li input[type="checkbox"]');
  71. function checkItems() {
  72. // 第2步: 判断当前状态, 只有全部选中, 才返回 true,否则就返回false
  73. // console.log([...items]);
  74. // console.log(Array.from(items));
  75. let status = [...items].every((item) => item.checked === true);
  76. // console.log(status);
  77. // 第3步: 用这个状态来更新全选按钮
  78. document.querySelector(".check-all").checked = status;
  79. }
  80. // (二) 商品的自动计算
  81. // 获取所有商品数量的元素
  82. const nums = document.querySelectorAll(".list .num");
  83. // 1. 计算商品总数
  84. function getTotalNum(numArr) {
  85. return numArr.reduce((acc, cur) => acc + cur);
  86. }
  87. // let numArr = [...nums].map(item => parseInt(item.value));
  88. // console.log(getTotalNum(numArr));
  89. // 2. 计算每个商品的金额: 数量 * 单价
  90. // numArr: 数量数组, priceArr: 单价数组
  91. function getAmount(numArr, priceArr) {
  92. // 用map(), 不用forEach? 因为map有返回值
  93. return numArr.map((num, index) => {
  94. // console.log(num, index);
  95. // 以index为索引条件在priceArr中进行查询获取与数量对应的单价
  96. return num * priceArr[index];
  97. });
  98. }
  99. // console.log(getAmount([1, 2, 3], [100, 200, 300]));
  100. // 3. 计算总金额
  101. function getTotalAmount(amountArr) {
  102. return amountArr.reduce((acc, cur) => acc + cur);
  103. }
  104. // console.log(getTotalAmount(getAmount([1, 2, 3], [100, 200, 300])));
  105. // 自动计算的通用方法
  106. function autoCalculate() {
  107. // 单价数组
  108. const prices = document.querySelectorAll(".list .price");
  109. let priceArr = [...prices].map((item) => parseInt(item.textContent));
  110. // 数量数组
  111. let numArr = [...nums].map((item) => parseInt(item.value));
  112. // 金额数组: 数量数组 * 单价数组
  113. const amountArr = getAmount(numArr, priceArr);
  114. // console.log(amountArr);
  115. // 将以上数量添加到页面
  116. // 1. 将总数量添加到页面
  117. document.querySelector(".total-num").textContent = getTotalNum(numArr);
  118. // 2. 将每个商品的金额填充
  119. document.querySelectorAll(".amount").forEach((item, index) => (item.textContent = amountArr[index]));
  120. // 3. 填充总金额
  121. document.querySelector(".total-amount").textContent = getTotalAmount(amountArr);
  122. }
  123. //勾选改变
  124. function chageCalculate() {
  125. //如果都为空,则清空数据
  126. let res = [...items].some((item, index) => item.checked);
  127. if (!res) {
  128. // 1. 将总数量添加到页面
  129. document.querySelector(".total-num").textContent = 0;
  130. // 2. 将每个商品的金额填充
  131. // document.querySelectorAll(".amount").forEach((item, index) => (item.textContent = 0));
  132. // 3. 填充总金额
  133. document.querySelector(".total-amount").textContent = 0;
  134. return false;
  135. }
  136. console.log(res);
  137. // 单价数组
  138. const prices = document.querySelectorAll(".list .price");
  139. let priceArr = [...prices].map((item) => parseInt(item.textContent));
  140. // 数量数组
  141. let numArr = [...nums].map((item) => parseInt(item.value));
  142. //勾选的数量
  143. numArr = numArr.filter(function (item, index) {
  144. return items[index].checked;
  145. });
  146. //勾选的商品金额
  147. priceArr = priceArr.filter((item, index) => [...items][index].checked);
  148. console.log(numArr, priceArr);
  149. // 金额数组: 数量数组 * 单价数组
  150. const amountArr = getAmount(numArr, priceArr);
  151. // console.log(amountArr);
  152. // 将以上数量添加到页面
  153. // 1. 将总数量添加到页面
  154. document.querySelector(".total-num").textContent = getTotalNum(numArr);
  155. // 2. 将每个商品的金额填充
  156. let amount = document.querySelectorAll(".amount");
  157. console.log(amount);
  158. amount = [...amount].map((item) => parseInt(item.textContent));
  159. console.log(amount);
  160. amount = amount.filter((item, index) => [...items][index].checked);
  161. console.log(amount);
  162. amount.forEach((item, index) => (item.textContent = amountArr[index]));
  163. // 3. 填充总金额
  164. document.querySelector(".total-amount").textContent = getTotalAmount(amountArr);
  165. }
  166. // 当页面加载时,根据默认值进行自动计算
  167. // window.addEventListener('load', autoCalculate, false);
  168. window.onload = autoCalculate;
  169. // 当用户更新商品数量时, 将会触发商品金额,总数量,和总金额的动态更新
  170. console.log(nums);
  171. nums.forEach((item) => (item.onchange = autoCalculate));
  172. items.forEach((item) => (item.onchange = chageCalculate));
  173. </script>
  174. <script>
  175. // 2. 实例演示JSON常用的二个API, 并详细描述前后端交互的原理与JSON的优势s
  176. // JSON.stringify() 对js对象进行json数据格式化
  177. let obj = {
  178. 1: "2",
  179. 8: "dd",
  180. d: "mo",
  181. 88: [2, 3, 46, 71, 9],
  182. };
  183. console.log(JSON.stringify(obj));
  184. //JSON.parse(),对json数据转为js对象
  185. let res = JSON.parse(JSON.stringify(obj));
  186. console.log(res);
  187. //前后端都是按照json格式编码和解码,只是不同的端的api接口不一样,但是json字符串格式是一样的,有利于json字符串的在不同平台被识别和解码。
  188. </script>
  189. </body>
  190. </html>
Correcting teacher:PHPzPHPz

Correction status:qualified

Teacher's comments:
Statement of this Website
The copyright of this blog article belongs to the blogger. Please specify the address when reprinting! If there is any infringement or violation of the law, please contact admin@php.cn Report processing!
All comments Speak rationally on civilized internet, please comply with News Comment Service Agreement
0 comments
Author's latest blog post
About us Disclaimer Sitemap
php.cn:Public welfare online PHP training,Help PHP learners grow quickly!