loading

【JS打卡】手写JS实现

日常打卡只写思路,这里集合题解

# 1、图片懒加载

demo :lazy-loading.html

还有个IntersectionObserver属性可用,不太懂就不写了。

其他问题:

  • 图片加载较多,DOM庞大,如何优化?复用img标签,使得当前页面最多只存在N个img
  • 图片加载异常?监听onError事件,如果加载异常,默认图代替
const imgArr = document.getElementsByTagName("img");
let n = 0;
// 节流,防止重复触发
const throttle = (fn, time) => {
  let timer = null;
  return function(...args) {
    if (!timer) {
      timer = setTimeout(() => {
        timer = null;
        fn.apply(this, args);
      }, time);
    }
  };
};
const lazyLoad = () => {
  // 可视区高度,固定值
  const seeHight = window.innerHeight;
  // 获取当前页面的滚动条纵坐标位置(Y轴)
  const scrollTop = document.documentElement.scrollTop;
  // 从n开始遍历
  for (let i = n; i < imgArr.length; i++) {
    // 如果图片距离顶部距离 < 滚动条距顶部高度 + 可视区高度
    // 认定该图片进入视野,可以进行加载
    if (imgArr[i].offsetTop < scrollTop + seeHight) {
      if (imgArr[i].getAttribute("src") === "./assets/loading.gif") {
        imgArr[i].src = imgArr[i].getAttribute("data-src");
      }
      n = i + 1;
    }
  }
};
// 监听滚动事件,添加节流,指定时间内只执行第一次
window.addEventListener("scroll", throttle(lazyLoad, 200));
// 页面第一次加载,无滚动事件,执行一次
lazyLoad();
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35

# 2、实现 add(1)(2)(3)

// 最简单
const add = x => y => z => x + y + z;
console.log(add(1)(2)(3));


1
2
3
4
5
最近更新时间: 2022/02/14 12:21:51
最近更新
01
2023/02/08 00:00:00
02
2023/01/03 00:00:00
03
2022/12/21 00:00:00