-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy path防抖,节流.html
77 lines (71 loc) · 2.88 KB
/
防抖,节流.html
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
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
<style>
#container {
width: 100%;
height: 200px;
line-height: 200px;
text-align: center;
color: #fff;
background-color: #444;
font-size: 30px;
}
</style>
</head>
<body>
<div id="container"></div>
<script>
//防抖debounce(可能最后点击了十次就执行了第一次和最后一次,中间都不执行)
// 典型例子:限制 鼠标连击 触发。
// 当一次事件发生后,事件处理器要等一定阈值的时间,如果这段时间过去后 再也没有事件发生,就处理最后一次发生的事件。假设还差 0.01 秒就到达指定时间,这时又来了一个事件,那么之前的等待作废,需要重新再等待指定时间。
var count = 1;
var container = document.getElementById('container');
function getUserAction() {
container.innerHTML = count++;
console.log('this-context->', this)
};
// container.onmousemove = getUserAction;
function debounce(fn, delay, immediate) {
let timer;
return function() {
if (immediate) {
fn.apply(this, arguments)
}
if (timer) clearTimeout(timer)
timer = setTimeout(() => {
fn.apply(this, arguments)
}, delay)
}
}
// container.addEventListener('mousemove', debounce(getUserAction, 500));
// 简单的防抖动函数
// 实际想绑定在 scroll 事件上的 handler
function realFunc() {
console.log("Success");
}
// 采用了防抖动
window.addEventListener('scroll', debounce(realFunc, 500));
// 没采用防抖动
window.addEventListener('scroll', realFunc);
// 节流(只是执行频率减慢了,但是一直执行)
// 可以理解为事件在一个管道中传输,加上这个节流阀以后,事件的流速就会减慢。实际上这个函数的作用就是如此,它可以将一个函数的调用频率限制在一定阈值内,例如 1s,那么 1s 内这个函数一定不会被调用两次
function throttle(fn, delay) {
let prev = 0;
return function() {
const args = arguments;
const now = +new Date();
if (now - prev > delay) {
fn.apply(this, args);
prev = now;
}
}
}
container.addEventListener('mousemove', throttle(getUserAction, 2000));
</script>
</body>
</html>