防抖
原理:在事件被触发n秒后再执行回调,如果在这n秒内又被触发,则重新计时,最后一次有效。
适用场景:
- 按钮提交场景:防止多次提交按钮,只执行最后提交的一次
- 服务端验证场景:表单验证需要服务端配合,只执行一段连续的输入事件的最后一次,还有搜索联想词功能类似
<!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>
#iii,
#jjj {
height: 100px;
width: 200px;
background: lightblue;
margin-bottom: 10px;
}
</style>
</head>
<body>
<div id="jjj">防抖</div>
</body>
<script>
// 防抖
function debounce(fn, wait) {
let timeout = null;
return function () {
if (timeout !== null) clearTimeout(timeout);
timeout = setTimeout(fn, wait);
}
}
// 处理函数
function handle() {
console.log(Math.random());
}
var jjj = document.getElementById('jjj');
jjj.onclick = debounce.call(this, handle, 1000);
</script>
</html>
节流
解决问题:防止在单位时间内多次触发。例如拖拽
原理:规定在一个单位时间内,只能触发一次函数。如果这个单位时间内触发多次函数,只有一次生效。
<!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>
body {
height: 100000px;
}
</style>
</head>
<body>
打开控制台,滚动屏幕
</body>
<script>
const throttle = (fn, delay = 500) => {
let flag = true;
return (...args) => {
if (!flag) return;
flag = false;
setTimeout(() => {
fn.apply(this, args);
flag = true;
}, delay);
};
};
// 处理函数
function handle() {
console.log(Math.random());
}
window.addEventListener('scroll', throttle(handle, 1000));
</script>
</html>
适用场景:
- 拖拽场景:固定时间内只执行一次,防止超高频次触发位置变动
- 缩放场景:监控浏览器resize
- 动画场景:避免短时间内多次触发动画引起性能问题
网友评论