【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
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
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