博客列表 >JS实战(自动轮播图+购物车自动计算)

JS实战(自动轮播图+购物车自动计算)

王浩
王浩原创
2021年10月05日 12:19:36559浏览
  1. 作业内容:
  2. 1. 给轮播图加上自动播放功能;
  3. 2. 给购物车加上选择时自动计算功能;
  4. 3. 复习之前的课程,找到短板,整理笔记;
  5. 4. 预习PHP知识,为节后新课做准备.

1. 给轮播图加上自动播放功能

具体生效代码如下:

  1. // 定时翻页
  2. setInterval(() => {
  3. document.querySelector(".next").dispatchEvent(new Event("click"));
  4. }, 2000);

完整代码经过修正,也贴上:

  1. const banners = [
  2. "images/banner_1.jpg",
  3. "images/banner_2.jpg",
  4. "images/banner_3.jpg",
  5. "images/banner_4.jpg",
  6. ];
  7. const imgGroup = document.querySelector(".container>.img-group");
  8. const btnGroup = document.querySelector(".container>.btn-group");
  9. //页面加载完,生成图片和按钮
  10. window.onload = () => {
  11. // 生成所有图片
  12. createImgs(imgGroup, banners.length);
  13. // 生成与图片对应大小的铵钮
  14. createBtns(btnGroup, banners.length);
  15. };
  16. // 生成所有图片
  17. function createImgs(p, len) {
  18. const frag = document.createDocumentFragment();
  19. for (let i = 0; i < len; i++) {
  20. // 创建图片元素
  21. const img = document.createElement("img");
  22. img.src = banners[i];
  23. img.dataset.index = i + 1;
  24. // 给第一张图片加上active样式
  25. if (i === 0) img.classList.add("active");
  26. frag.append(img);
  27. }
  28. p.append(frag);
  29. }
  30. // 生成与图片对应大小的铵钮
  31. function createBtns(p, len) {
  32. const frag = document.createDocumentFragment();
  33. for (let i = 0; i < len; i++) {
  34. const btn = document.createElement("span");
  35. btn.dataset.index = i + 1;
  36. // 给第一个按钮增加active样式
  37. if (i === 0) btn.classList.add("active");
  38. // 为按钮添加onclick事件
  39. btn.onclick = showImgs;
  40. frag.append(btn);
  41. }
  42. p.append(frag);
  43. }
  44. // 按钮事件
  45. function showImgs(ev) {
  46. const index = ev.target.dataset.index;
  47. [...imgGroup.children].forEach((item) => item.classList.remove("active"));
  48. [...btnGroup.children].forEach((item) => item.classList.remove("active"));
  49. ev.target.classList.add("active");
  50. [...imgGroup.children].filter((item) => item.dataset.index === index)[0].classList.add("active");
  51. }
  52. // 翻页,向前-1,向后1
  53. function nextImg(ev, direction) {
  54. ev.preventDefault();
  55. let index = imgGroup.querySelector(".active").dataset.index;
  56. let count = banners.length;
  57. direction > 0 ? ++index : --index;
  58. index === 0 ? (index = count) : index;
  59. index > count ? (index = 1) : index;
  60. [...imgGroup.children].forEach((item) => item.classList.remove("active"));
  61. [...btnGroup.children].forEach((item) => item.classList.remove("active"));
  62. [...imgGroup.children]
  63. .filter((item) => item.dataset.index === index.toString())[0]
  64. .classList.add("active");
  65. [...btnGroup.children]
  66. .filter((item) => item.dataset.index === index.toString())[0]
  67. .classList.add("active");
  68. }
  69. // 定时翻页
  70. setInterval(() => {
  71. document.querySelector(".next").dispatchEvent(new Event("click"));
  72. }, 2000);

2. 给购物车加上选择时自动计算功能;

  1. // 三句代码实现:当选择某个商品或去掉某个商品时, 能自动计算
  2. // 第一句在checkAll.onchange里加上一个autoCalculate(),即下面代码第11行
  3. // 第二句在checkItems.onchange里加上一个autoCalculate(),即下面代码第16行
  4. // 最后一句在计算的函数里,添加一条判断语句,即下面代码第37行。判断前面的check如果没勾上,就不纳入计算
  1. // 全选复选框
  2. const checkAll = document.querySelector("#check-all");
  3. const checkItems = document.getElementsByName("item");
  4. // change: 当控件中的值发生变化时触发
  5. // 将全选按钮的状态,赋值给下面所有的商品的checkbox
  6. checkAll.onchange = function (ev) {
  7. checkItems.forEach(function (item) {
  8. item.checked = ev.target.checked;
  9. });
  10. autoCalculate();
  11. };
  12. checkItems.forEach(function (item) {
  13. item.onchange = function (ev) {
  14. autoCalculate();
  15. //只有全部选中才更新全选按钮的状态
  16. checkAll.checked = [...checkItems].every(function (item) {
  17. return item.checked;
  18. });
  19. };
  20. });
  21. // 自动计算
  22. // 所有的计算,都是基于数量的变化
  23. const numInput = document.querySelectorAll('input[type="number"]');
  24. numInput.forEach(function (input) {
  25. input.onchange = autoCalculate;
  26. });
  27. function autoCalculate() {
  28. // 1. 获取每个商品的金额: 数量 * 单价
  29. const numbers = document.querySelectorAll('input[type="number"]');
  30. const numArr = [...numbers].map(function (num) {
  31. if (!num.parentNode.parentNode.getElementsByClassName("item")[0].checked) return 0;
  32. return num.value * 1;
  33. });
  34. const prices = document.querySelectorAll("tbody .price");
  35. const priceArr = [...prices].map(function (num) {
  36. return num.textContent * 1;
  37. });
  38. // 2. 计算出每个商品的金额(数组)
  39. const amountArr = [priceArr, numArr].reduce(function (prev, curr) {
  40. return prev.map(function (item, key) {
  41. return item * curr[key];
  42. });
  43. });
  44. // console.log(amountArr);
  45. // 3. 总金额
  46. let total = amountArr.reduce(function (prev, curr) {
  47. return prev + curr;
  48. });
  49. // 4. 总数量
  50. let sum = numArr.reduce(function (prev, curr) {
  51. return prev + curr;
  52. });
  53. // 5. 将所有数据渲染到页面中
  54. document.querySelectorAll(".amount").forEach(function (item, index) {
  55. item.textContent = amountArr[index];
  56. });
  57. document.querySelector("#total-amount").textContent = total;
  58. document.querySelector("#sum").textContent = sum;
  59. }
  60. window.onload = autoCalculate;
  61. // 作业 : 当选择某个商品或去掉某个商品时, 能自动计算

3. 预习和复习相关部分已经在陆续进行

声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议