JavaScript节流和防抖
Posted 码妈
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JavaScript节流和防抖相关的知识,希望对你有一定的参考价值。
节流和防抖的区别
函数节流是减少连续的高频操作函数执行次数 (例如连续调用10次, 可能只执行3-4次)
函数防抖是让连续的高频操作时函数只执行一次(例如连续调用10次, 但是只会执行1次)
节流(throttle)
函数节流应用场景
oninput / onmousemove / onscroll / onresize等事件
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>节流throttle</title>
<style>
*{
margin: 0;
padding: 0;
}
div{
width: 200px;
height: 200px;
background: red;
position: absolute;
left: 50%;
top: 50%;
transform: translate(-50%, -50%);
}
</style>
</head>
<body>
<div></div>
<script>
let oDiv = document.querySelector("div"); // 获取div
function getScreen() { // 封装好的获取网页宽高,有需要的也可以拿去使用
let width, height;
if(window.innerWidth){
width = window.innerWidth;
height = window.innerHeight;
}else if(document.compatMode === "BackCompat"){
width = document.body.clientWidth;
height = document.body.clientHeight;
}else{
width = document.documentElement.clientWidth;
height = document.documentElement.clientHeight;
}
return {
width: width,
height: height
}
}
function resetSize(){
let { width, height } = getScreen();
// 设置div的宽高为网页宽高的一半
oDiv.style.width = width / 2 + "px";
oDiv.style.height = height / 2 + "px";
}
resetSize();
let timerId = null;
let flag = true;
window.onresize = function () { // onresize获取或设置当前窗口
if(!flag){ // 执行结果 if(false) if(true) if(false)
return;
}
flag = false;
timerId && clearTimeout(timerId); // 清空一次性定时器
timerId = setTimeout(function () { // 开启一次性定时器
flag = true;
resetSize();
console.log("尺寸的变化");
}, 500); // 500毫秒后执行
// resetSize(); // 不用防抖,浏览器窗口宽高每发生一变化就会发送一次请求
// console.log("尺寸的变化");
}
</script>
</body>
</html>
结果
改变窗口大小之前 | 改变窗口大小之后 |
---|---|
防抖(debounce)
函数防抖应用场景
oninput / onmousemove / onscroll / onresize等事件
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>防抖debounce</title>
</head>
<body>
<input type="text">
<script>
let oInput = document.querySelector("input"); // 获取input元素
let timerId = null; // 用变量保存定时器的返回值
oInput.oninput = function () { // input监听实时输入事件
timerId && clearTimeout(timerId); // 清空一次性定时器
timerId = setTimeout(function () { // 创建一次性定时器
console.log("打印发送请求次数");
}, 1000); // 1000毫秒后执行
// console.log(this.value); // 不用节流,每输入一个字就会发送一次请求
// console.log("打印发送请求次数");
}
</script>
</body>
</html>
结果
快速输入123 | 快速输入456 |
---|---|
以上是关于JavaScript节流和防抖的主要内容,如果未能解决你的问题,请参考以下文章