博客列表 >0114 购物车计算金额

0114 购物车计算金额

fanyigle_php
fanyigle_php原创
2021年03月31日 19:21:23613浏览

以老师写的dom为基础,用js原生函数写的,后面在写jQuery
变化因子包括全选\反选,单品选中\反选,数量的改变(同时检查它自己的复选框是否被选中)

  1. <!DOCTYPE html>
  2. <html lang="zh-CN">
  3. <head>
  4. <meta charset="UTF-8" />
  5. <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  6. <title>购物车自动计算</title>
  7. <link rel="stylesheet" href="style.css" />
  8. </head>
  9. <body>
  10. <table>
  11. <caption>
  12. 购物车
  13. </caption>
  14. <thead>
  15. <tr>
  16. <!-- 全选复选框 -->
  17. <th>
  18. <input
  19. type="checkbox"
  20. name="checkAll"
  21. id="check-all"
  22. checked
  23. /><label for="check-all">全选</label>
  24. </th>
  25. <th>图片</th>
  26. <th>品名</th>
  27. <th>单位</th>
  28. <th>单价/元</th>
  29. <th>数量</th>
  30. <th>金额/元</th>
  31. </tr>
  32. </thead>
  33. <tbody>
  34. <tr>
  35. <td>
  36. <input type="checkbox" name="item" value="SN-1020" checked />
  37. </td>
  38. <td>
  39. <a href=""><img src="images/p1.jpg" alt="" /></a>
  40. </td>
  41. <td>iPhone 11</td>
  42. <td></td>
  43. <td class="price">4799</td>
  44. <td><input type="number" min="1" value="1" /></td>
  45. <td class="amount">xxxx</td>
  46. </tr>
  47. <tr>
  48. <td>
  49. <input type="checkbox" name="item" value="SN-1020" checked />
  50. </td>
  51. <td>
  52. <a href=""><img src="images/p2.jpg" alt="" /></a>
  53. </td>
  54. <td>小米pro 11</td>
  55. <td></td>
  56. <td class="price">3999</td>
  57. <td><input type="number" min="1" value="2" /></td>
  58. <td class="amount">xxxx</td>
  59. </tr>
  60. <tr>
  61. <td>
  62. <input type="checkbox" name="item" value="SN-1030" checked />
  63. </td>
  64. <td>
  65. <a href=""><img src="images/p3.jpg" alt="" /></a>
  66. </td>
  67. <td>MacBook Pro</td>
  68. <td></td>
  69. <td class="price">18999</td>
  70. <td><input type="number" min="1" value="1" /></td>
  71. <td class="amount">xxxx</td>
  72. </tr>
  73. <tr>
  74. <td>
  75. <input type="checkbox" name="item" value="SN-1040" checked />
  76. </td>
  77. <td>
  78. <a href=""><img src="images/p4.jpg" alt="" /></a>
  79. </td>
  80. <td>小米75电视</td>
  81. <td></td>
  82. <td class="price">5999</td>
  83. <td><input type="number" min="1" value="2" /></td>
  84. <td class="amount">xxxx</td>
  85. </tr>
  86. <tr>
  87. <td>
  88. <input type="checkbox" name="item" value="SN-1050" checked />
  89. </td>
  90. <td>
  91. <a href=""><img src="images/p5.jpg" alt="" /></a>
  92. </td>
  93. <td>Canon 90D单反</td>
  94. <td></td>
  95. <td class="price">9699</td>
  96. <td><input type="number" min="1" value="1" /></td>
  97. <td class="amount">xxxx</td>
  98. </tr>
  99. </tbody>
  100. <tfoot>
  101. <tr style="font-weight: bolder; font-size: 1.2em">
  102. <td colspan="5">总计:</td>
  103. <td id="sum">xxxx</td>
  104. <td id="total-amount">xxxx</td>
  105. </tr>
  106. </tfoot>
  107. </table>
  108. <div style="width: 90%; margin: 10px auto">
  109. <button style="float: right; width: 100px">结算</button>
  110. </div>
  111. <script>
  112. // 1. 获取全选复选框,所有独立商品的复选框
  113. const checkAll = document.querySelector("#check-all");
  114. const checkItems = document.getElementsByName("item");
  115. // 2. 为全选复选框添加事件: change,当值改变会触发
  116. // console.log(ev.target.checked); // 看当前全选的状态
  117. checkAll.onchange = (ev) =>
  118. checkItems.forEach((item) => (item.checked = ev.target.checked));
  119. // 3. 为每个单独的商品复选框添加change
  120. checkItems.forEach(
  121. (item) =>
  122. (item.onchange = () => {
  123. checkAll.checked = [...checkItems].every((item) => item.checked);
  124. //autoCalculate();
  125. })
  126. );
  127. // =====================================================
  128. // 获取所有的数量控件
  129. const numInput = document.querySelectorAll('tbody input[type="number"');
  130. // // 用户更新数量时触发自动计算
  131. // numInput.forEach((input) => {
  132. // //单独onchange?
  133. // input.onchange = autoCalculate;
  134. // });
  135. // 购物车刚加载完成时也应该触发自动计算
  136. window.onload = autoCalculate;
  137. //表格change触发
  138. const myTable = document.querySelector("table");
  139. myTable.onchange = autoCalculate;
  140. // 封装一个自动计算的函数
  141. function autoCalculate() {
  142. // 获取单价组成的数组
  143. const prices = document.querySelectorAll("tbody .price");
  144. const priceArr = [...prices].map((item) => item.textContent * 1);
  145. console.log(priceArr);
  146. // 获取数量组成的数组
  147. const numbers = document.querySelectorAll("tbody input[type=number]");
  148. let numArr = [...numbers].map((item) => item.value * 1);
  149. console.log(numArr);
  150. // 计算每件商品金额, 单价 * 数量
  151. let amountArr = [priceArr, numArr].reduce((total, curr) =>
  152. total.map((item, index) => item * curr[index])
  153. );
  154. console.log(amountArr);
  155. // 每个商品的金额写到页面上
  156. document
  157. .querySelectorAll(".amount")
  158. .forEach((item, index) => (item.textContent = amountArr[index]));
  159. // ---------------------------------
  160. // 商品总数
  161. // 用filter过滤出选中的商品
  162. numArr = numArr.filter((item, index) => {
  163. // console.log(checkItems[index].checked);
  164. return checkItems[index].checked;
  165. });
  166. let sum = numArr.length ? numArr.reduce((pre, cur) => pre + cur) : 0;
  167. // 计算总金额
  168. // 用filter过滤出选中的商品
  169. amountArr = amountArr.filter((item, index) => {
  170. // console.log(checkItems[index].checked);
  171. return checkItems[index].checked;
  172. });
  173. let totalAmount = amountArr.length
  174. ? amountArr.reduce((pre, cur) => pre + cur)
  175. : 0;
  176. console.log(totalAmount);
  177. // 将计算结果渲染到购物车中
  178. // 总数量
  179. document.querySelector("#sum").textContent = sum;
  180. // 总金额
  181. document.querySelector("#total-amount").textContent = totalAmount;
  182. }
  183. </script>
  184. </body>
  185. </html>
声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议