欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

jQuery|原生js-分别购物车全选|全不选-勾选|不勾选自动计算

程序员文章站 2022-03-03 23:36:31
...

jQuery|原生js-分别购物车全选|全不选-勾选|不勾选自动计算

  1. 使用jQuery完成购物车全选/全不选操作;
  2. 这现勾选/不勾选商品时购物车也能自动完成计算
  • head 中引入购物车样式和jQuery库
  1. <!-- 购物车css样式 -->
  2. <link rel="stylesheet" href="style.css" />
  3. <!-- 引入 jQuery 库 -->
  4. <script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
  • 引入的购物车样式 style.css 是默认的
  1. table {
  2. border-collapse: collapse;
  3. width: 90%;
  4. text-align: center;
  5. margin: auto;
  6. }
  7. table caption {
  8. margin-bottom: 15px;
  9. font-size: 1.5rem;
  10. }
  11. table th,
  12. table td {
  13. border-bottom: 1px solid #ccc;
  14. padding: 5px;
  15. font-weight: normal;
  16. }
  17. table thead tr:first-of-type {
  18. background-color: #e6e6e6;
  19. height: 3em;
  20. }
  21. table input[type="checkbox"] {
  22. width: 1.5em;
  23. height: 1.5em;
  24. }
  25. table tbody tr {
  26. border-bottom: 1px solid #ccc;
  27. }
  28. table tbody tr:hover {
  29. background-color: #f6f6f6;
  30. cursor: pointer;
  31. }
  32. tbody img {
  33. width: 3em;
  34. }
  35. tbody input[type="number"] {
  36. width: 3em;
  37. }
  38. button {
  39. width: 150px;
  40. height: 30px;
  41. outline: none;
  42. border: none;
  43. background-color: teal;
  44. color: white;
  45. letter-spacing: 5px;
  46. }
  47. button:hover {
  48. opacity: 0.7;
  49. cursor: pointer;
  50. }
  • body 中添加购物车html是默认的
  1. <table>
  2. <caption>
  3. 购物车
  4. </caption>
  5. <thead>
  6. <tr>
  7. <!-- 全选复选框 -->
  8. <th><input type="checkbox" name="checkAll" id="check-all" checked /><label for="check-all">全选</label>
  9. </th>
  10. <th>图片</th>
  11. <th>品名</th>
  12. <th>单位</th>
  13. <th>单价/元</th>
  14. <th>数量</th>
  15. <th>金额/元</th>
  16. </tr>
  17. </thead>
  18. <tbody>
  19. <tr>
  20. <td>
  21. <input type="checkbox" name="item" value="SN-1020" checked />
  22. </td>
  23. <td>
  24. <a href=""><img src="images/p1.jpg" alt="" /></a>
  25. </td>
  26. <td>iPhone 11</td>
  27. <td></td>
  28. <td class="price">4799</td>
  29. <td><input type="number" min="1" value="1" /></td>
  30. <td class="amount">xxxx</td>
  31. </tr>
  32. <tr>
  33. <td>
  34. <input type="checkbox" name="item" value="SN-1020" checked />
  35. </td>
  36. <td>
  37. <a href=""><img src="images/p2.jpg" alt="" /></a>
  38. </td>
  39. <td>小米pro 11</td>
  40. <td></td>
  41. <td class="price">3999</td>
  42. <td><input type="number" min="1" value="2" /></td>
  43. <td class="amount">xxxx</td>
  44. </tr>
  45. <tr>
  46. <td>
  47. <input type="checkbox" name="item" value="SN-1030" checked />
  48. </td>
  49. <td>
  50. <a href=""><img src="images/p3.jpg" alt="" /></a>
  51. </td>
  52. <td>MacBook Pro</td>
  53. <td></td>
  54. <td class="price">18999</td>
  55. <td><input type="number" min="1" value="1" /></td>
  56. <td class="amount">xxxx</td>
  57. </tr>
  58. <tr>
  59. <td>
  60. <input type="checkbox" name="item" value="SN-1040" checked />
  61. </td>
  62. <td>
  63. <a href=""><img src="images/p4.jpg" alt="" /></a>
  64. </td>
  65. <td>小米75电视</td>
  66. <td></td>
  67. <td class="price">5999</td>
  68. <td><input type="number" min="1" value="2" /></td>
  69. <td class="amount">xxxx</td>
  70. </tr>
  71. <tr>
  72. <td>
  73. <input type="checkbox" name="item" value="SN-1050" checked />
  74. </td>
  75. <td>
  76. <a href=""><img src="images/p5.jpg" alt="" /></a>
  77. </td>
  78. <td>Canon 90D单反</td>
  79. <td></td>
  80. <td class="price">9699</td>
  81. <td><input type="number" min="1" value="1" /></td>
  82. <td class="amount">xxxx</td>
  83. </tr>
  84. </tbody>
  85. <tfoot>
  86. <tr style="font-weight: bolder; font-size: 1.2em">
  87. <td colspan="5">总计:</td>
  88. <td id="sum">xxxx</td>
  89. <td id="total-amount">xxxx</td>
  90. </tr>
  91. </tfoot>
  92. </table>
  93. <div style="width: 90%; margin: 10px auto">
  94. <button style="float: right; width: 100px">结算</button>
  95. </div>

1. 使用jQuery完成购物车全选/全不选操作

  • bodyscript 标签中添加js
  1. // 使用jQuery完成购物车全选/全不选操作
  2. // 全选复选框
  3. const checkAll = $("#check-all");
  4. // 独立复选框
  5. const checkItems = $("input[name=\"item\"]");
  6. // 改变全选,独立复选框也改变
  7. checkAll.change(ev => checkItems.each(function () {
  8. $(this).prop('checked', $(ev.target).is(':checked'));
  9. }));
  10. // 改变独立复选框,改变全选
  11. checkItems.change(() => checkAll.prop('checked', [...checkItems].every(item => item.checked)));

jQuery|原生js-分别购物车全选|全不选-勾选|不勾选自动计算

2. 这现勾选/不勾选商品时购物车也能自动完成计算

  • 续写 jQuery 版购物车完成自动计算
  1. // 购物车,数据填充
  2. function cart() {
  3. // 独立单价组
  4. let pricesObj = $('.price').map((i, ele) => $(ele).text() * 1);
  5. // 独立数量组
  6. let numbersObj = $('input[type="number"]').map((i, ele) => $(ele).val() * 1);
  7. // 独立金额组
  8. let amountsObj = [pricesObj, numbersObj].reduce((total, curr) => total.map((i, item) => item * curr[i]));
  9. // 独立金额数据填充,由单品数量改变触发,与独立复选框状态无关
  10. $('.amount').each((i, ele) => ($(ele).text(amountsObj[i])));
  11. // 总数量,总金额的计算由独立复选框选中状态确定
  12. // 获取所有独立复选框元素
  13. let items = $("input[name=\"item\"]");
  14. // 过滤出所有独立复选框选中状态的组
  15. numbersObj = numbersObj.filter((i, ele) => $(items[i]).is(':checked'));
  16. // 过滤出所有独立复选框选中状态的金额组
  17. amountsObj = amountsObj.filter((i, ele) => $(items[i]).is(':checked'));
  18. // 计算总数量和总金额
  19. let sum = [...numbersObj].reduce((p, n) => p + n, 0);
  20. let total = [...amountsObj].reduce((p, n) => p + n, 0);
  21. // 填充总数量和总金额到页面中
  22. $('#sum').text(sum);
  23. $('#total-amount').text(total);
  24. }
  25. // 改变单品数量时触发
  26. $('input[type="number"]').each((i, ele) => $(ele).change(function(){
  27. cart();
  28. }));
  29. // 改变独立复选框状态时触发
  30. $("input[name=\"item\"]").each((i, item) => $(item).change(function(){
  31. cart();
  32. }));
  33. // 全选状态改变时触发
  34. $('#check-all').change(function(){
  35. cart();
  36. });
  37. // 页面载入完成后触发
  38. $(function(){
  39. cart();
  40. });
  • 将以上 jQuery 版购物车全部注释,原生 js 版,完成自动计算
  1. // 原生js购物车全选/全不选操作
  2. // 全选复选框
  3. const checkAll = document.getElementById('check-all');
  4. // 独立复选框
  5. const checkItems = document.getElementsByName('item');
  6. // 改变全选,独立复选框也改变
  7. checkAll.onchange = ev => checkItems.forEach(item => item.checked = ev.target.checked);
  8. // 改变独立复选框,改变全选
  9. checkItems.forEach(item => item.onchange = () => checkAll.checked = [...checkItems].every(ele => ele.checked));
  10. // 购物车,数据填充
  11. function cart() {
  12. // 独立单价数组
  13. let pricesArr = [...document.getElementsByClassName('price')].map(p => p.textContent * 1);
  14. // 独立数量数组
  15. let numbersArr = [...document.querySelectorAll('input[type="number"]')].map(n => n.value * 1);
  16. // 独立金额数组
  17. let amountsArr = [pricesArr, numbersArr].reduce((total, curr) => total.map((item, i) => item * curr[i]));
  18. // 独立金额数据填充,由单品数量改变触发,与独立复选框状态无关
  19. document.querySelectorAll('.amount').forEach((ele, i) => (ele.textContent = amountsArr[i]));
  20. // 总数量,总金额的计算由独立复选框选中状态确定
  21. // 获取所有独立复选框元素
  22. let items = document.getElementsByName('item');
  23. // 过滤出所有独立复选框选中状态的数量数组
  24. numbersArr = numbersArr.filter((ele, i) => [...items][i].checked);
  25. // 过滤出所有独立复选框选中状态的金额数组
  26. amountsArr = amountsArr.filter((ele, i) => [...items][i].checked);
  27. // 计算总数量和总金额
  28. let sum = numbersArr.reduce((p, n) => p + n, 0);
  29. let total = amountsArr.reduce((p, n) => p + n, 0);
  30. // 填充总数量和总金额到页面中
  31. document.getElementById('sum').textContent = sum;
  32. document.getElementById('total-amount').textContent = total;
  33. }
  34. // 改变单品数量时触发
  35. document.querySelectorAll('input[type="number"]').forEach(ele => ele.onchange = cart);
  36. // 改变独立复选框状态时触发
  37. document.getElementsByName('item').forEach(item => item.onchange = cart);
  38. // 全选状态改变时触发
  39. // 由于前面 check-all 已添加 onchange 事件,这里使用事件监听
  40. document.getElementById('check-all').addEventListener('change', cart);
  41. // 页面载入完成后触发
  42. window.onload = cart;
  • 效果和 jQuery 版是一样的

jQuery|原生js-分别购物车全选|全不选-勾选|不勾选自动计算

  • 点击取消全选,数量和总金额清零

jQuery|原生js-分别购物车全选|全不选-勾选|不勾选自动计算

  • 只选中第2和第3个商品,将第3个商品数量改为2,改动其它未被选中的商品,不计算在总计内,只计算到右边独立商品的金额处

jQuery|原生js-分别购物车全选|全不选-勾选|不勾选自动计算