博客列表 >原生购物车

原生购物车

再见羊肉串儿
再见羊肉串儿原创
2021年08月05日 20:55:51687浏览
  1. <!DOCTYPE html>
  2. <html lang="en">
  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. <link rel="stylesheet" href="style.css" />
  8. <title>购物车</title>
  9. <style></style>
  10. </head>
  11. <body>
  12. <table>
  13. <caption>
  14. <h2>我的购物车</h2>
  15. </caption>
  16. <thead>
  17. <th>
  18. <input type="checkbox" name="checkAll" id="checkAll" checked />
  19. <label for="checkAll">全选</label>
  20. </th>
  21. <th>图片</th>
  22. <th>品名</th>
  23. <th>单位</th>
  24. <th>单价/元</th>
  25. <th>数量</th>
  26. <th>金额/元</th>
  27. </thead>
  28. <tbody>
  29. <tr>
  30. <td>
  31. <input type="checkbox" name="item" class="item" checked />
  32. </td>
  33. <td>
  34. <img src="images/p1.png" />
  35. </td>
  36. <td>JavaScript权威指南(第七版)</td>
  37. <td></td>
  38. <td>100</td>
  39. <td>
  40. <input type="number" class="num" min="1" value="1" />
  41. </td>
  42. <td class="amount">0</td>
  43. </tr>
  44. <tr>
  45. <td>
  46. <input type="checkbox" name="item" class="item" checked />
  47. </td>
  48. <td>
  49. <img src="images/p2.png" />
  50. </td>
  51. <td>JavaScript权威指南(第七版)</td>
  52. <td></td>
  53. <td>200</td>
  54. <td>
  55. <input type="number" class="num" min="1" value="1" />
  56. </td>
  57. <td class="amount">0</td>
  58. </tr>
  59. <tr>
  60. <td>
  61. <input type="checkbox" name="item" class="item" checked />
  62. </td>
  63. <td>
  64. <img src="images/p3.png" />
  65. </td>
  66. <td>JavaScript权威指南(第七版)</td>
  67. <td></td>
  68. <td>300</td>
  69. <td>
  70. <input type="number" class="num" min="1" value="1" />
  71. </td>
  72. <td class="amount">0</td>
  73. </tr>
  74. <tr>
  75. <td>
  76. <input type="checkbox" name="item" class="item" checked />
  77. </td>
  78. <td>
  79. <img src="images/p4.png" />
  80. </td>
  81. <td>JavaScript权威指南(第七版)</td>
  82. <td></td>
  83. <td>400</td>
  84. <td>
  85. <input type="number" class="num" min="1" value="1" />
  86. </td>
  87. <td class="amount">0</td>
  88. </tr>
  89. <tr>
  90. <td>
  91. <input type="checkbox" name="item" class="item" />
  92. </td>
  93. <td>
  94. <img src="images/p5.png" />
  95. </td>
  96. <td>JavaScript权威指南(第七版)</td>
  97. <td></td>
  98. <td>500</td>
  99. <td>
  100. <input type="number" class="num" min="1" value="1" />
  101. </td>
  102. <td class="amount">0</td>
  103. </tr>
  104. </tbody>
  105. <tfoot>
  106. <tr>
  107. <td colspan="5">总计</td>
  108. <td>0</td>
  109. <td>0</td>
  110. </tr>
  111. </tfoot>
  112. </table>
  113. <script src="demo.js"></script>
  114. </body>
  115. </html>
  1. * {
  2. margin: 0;
  3. padding: 0;
  4. box-sizing: border-box;
  5. }
  6. html {
  7. font-size: 10px;
  8. }
  9. body {
  10. font-size: 1.6rem;
  11. }
  12. /* table样式 */
  13. /* 表格*/
  14. table {
  15. margin: 0 auto;
  16. border-collapse: collapse;
  17. }
  18. input,
  19. label:hover {
  20. cursor: pointer;
  21. }
  22. /* 隔行变色 */
  23. tr:nth-of-type(even) {
  24. background-color: gainsboro;
  25. }
  26. caption {
  27. margin: 1rem 0;
  28. }
  29. /* tbody样式 */
  30. thead {
  31. background-color: green;
  32. color: white;
  33. }
  34. tfoot {
  35. background-color: lightblue;
  36. }
  37. /* 设置边框线 */
  38. th,
  39. td {
  40. text-align: center;
  41. padding: 1rem;
  42. }
  43. /* 图片大小 */
  44. td > img {
  45. width: 3em;
  46. height: 3em;
  47. }
  1. /**
  2. * 当页面加载成功后计算选中商品的价格和数目
  3. * */
  4. window.onload = autoCalculate;
  5. //获取“全选"按钮元素
  6. let checkAllBtn = document.querySelector("#checkAll");
  7. //获取多选框元素
  8. let checkBoxArr = document.querySelectorAll("input[name='item']");
  9. /**
  10. * 全选与全不选
  11. */
  12. // checkAllBtn.onclick = function (ev) {
  13. // checkBoxArr.forEach(function (item) {
  14. // item.checked = ev.target.checked;
  15. // });
  16. // };
  17. //上面注释的简化形式
  18. checkAllBtn.onclick = (ev) =>
  19. checkBoxArr.forEach((item) => (item.checked = ev.target.checked));
  20. //每次点击也要计算一次数据
  21. checkAllBtn.onchange = autoCalculate;
  22. /**
  23. * 只有一个没有选中,全选框就不选中
  24. */
  25. checkBoxArr.forEach(function (item) {
  26. item.onclick = function () {
  27. let res = [...checkBoxArr].every(function (ite) {
  28. return ite.checked;
  29. });
  30. checkAllBtn.checked = res;
  31. };
  32. //每次点击也要计算一次数据
  33. item.onchange = autoCalculate;
  34. });
  35. // 获取产品单价元素
  36. let tdPriceArr = document.querySelectorAll("tr >td:nth-of-type(5)");
  37. let priceArr = [...tdPriceArr].map(function (ev) {
  38. return ev.textContent * 1;
  39. });
  40. //当数量发生变化的时候获取数量
  41. let tdNumArr = document.querySelectorAll(".num");
  42. //当每一个数量框发生变化时调用方法autoCalculate
  43. tdNumArr.forEach(function (ev) {
  44. ev.onchange = autoCalculate;
  45. });
  46. function autoCalculate() {
  47. let numArr = [...tdNumArr].map(function (item) {
  48. return item.value * 1;
  49. });
  50. // let p = [numArr, priceArr].reduce(function (prev, curr) {
  51. // let a = prev.map(function (item, index) {
  52. // return item * curr[index];
  53. // });
  54. // return a;
  55. // });
  56. //上面注释的简化
  57. // 计算每种商品的消耗的总金额,数量*单价
  58. let o = [numArr, priceArr].reduce((prev, curr) =>
  59. prev.map((item, index) => item * curr[index])
  60. );
  61. // 将价格放到每款产品后面
  62. let price = document.querySelectorAll(".amount");
  63. price.forEach(function (items, index) {
  64. items.textContent = o[index];
  65. });
  66. /**
  67. * 给总计赋值
  68. * 获取选中的tr,如果没有选中的tr则默认总计的地方都为0
  69. */
  70. let totleNum = document.querySelector("tfoot > tr > td:nth-of-type(2)");
  71. let totlePrice = document.querySelector("tfoot > tr > td:nth-of-type(3)");
  72. let checkArr = document.querySelectorAll("input[name='item']:checked");
  73. // console.log(checkArr.length);
  74. if (checkArr.length > 0) {
  75. // 获取选中的tr里面的价格
  76. let pricecarr = [...checkArr].map(function (ev) {
  77. return (
  78. ev.parentNode.parentNode.querySelector("td:nth-of-type(5)")
  79. .textContent * 1
  80. );
  81. });
  82. // 获取选中的tr里面的数量
  83. let numcarr = [...checkArr].map(function (ev) {
  84. return ev.parentNode.parentNode.querySelector(".num").value * 1;
  85. });
  86. let c = [numcarr, pricecarr].reduce((prev, curr) =>
  87. prev.map((item, index) => item * curr[index])
  88. );
  89. //总计里面的数据只计算选中的,不选中的不计算
  90. totleNum.textContent = numcarr.reduce(function (prev, curr) {
  91. return prev + curr;
  92. });
  93. totlePrice.textContent = c.reduce(function (prev, curr) {
  94. return prev + curr;
  95. });
  96. } else {
  97. totleNum.textContent = 0;
  98. totlePrice.textContent = 0;
  99. }
  100. }
声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议