函数防抖(debounce)
就是指触发事件后在 n 秒内函数只能执行一次,如果在 n 秒内又触发了事件,则会重新计算函数执行时间。(就是让某个函数在上一次执行之后,满足等待某个时间内不再触发此函数后再执行,而在这个等待时间内再次触发函数,等待时间可以重新计算,知道该函数在一定间隔内没有被调用时,才开始执行被调用方法)
应用场景:用户注册时候的手机号验证和邮箱验证,搜索框,页面上下滚动
假设我们网站有个搜索框,用户输入文本我们会自动联想匹配出一些结果供用户选择。我们可能首先想到到的做法就是监听keypress事件,但是如果用户快速的输入一连串字符,假设是10个字符,就会在瞬间触发了10次请求。我们想要的是用户停止输入的时候才去触发查询的请求,这个时候函数防抖可以帮助我们。
function debouce(func,wait) {
let timer;
return function(){
if(timer) clearTimeout(timer);
timer = setTimeout(()=>func(),wait)
}
}
函数节流(throttle):所谓节流,就是指连续触发事件但是在N秒中只执行一次函数)节流会稀释函数的执行频率。让一个函数无法在很短的时间间隔内连续调用,当上一次执行完之后过了规定的时间间隔,才能进行下一次的函数调用。避免函数的过多执行
应用场景:window对象的resize、scroll事件拖拽时候的mousemove射击游戏中的mousedown、keydown事件文字输入、自动完成的keyup事件
function throttle(func,wait) {
let previous = new Date();
return function(){
let now = new Date();
if(now - previous > wait){
previous = now;
func();
}
}
}
//节流2(setTimeout)
function throttle2(func,wait) {
let timer;
return function () {
if (!timer) {
timer = setTimeout(() => {
func();
timer = null; // clearTimeout(timer) 错误
}, wait);
}
}
}
全部代码:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<style>
#count{
height: 100px;
background-color: darkgrey;
text-align: center;
display: flex;
align-items: center;
}
</style>
</head>
<body>
<div id="count"></div>
</body>
<script>
var countDiv = document.getElementById('count');
function add() {
countDiv.innerText++;
}
//原始
countDiv.onmousemove = add;
//优化
countDiv.onmousemove = throttle2(add,500);
//防抖(setTimeout)
function debouce(func,wait) {
let timer;
return function(){
if(timer) clearTimeout(timer);
timer = setTimeout(()=>func(),wait)
}
}
//节流1(比较时间差)
function throttle(func,wait) {
let previous = new Date();
return function(){
let now = new Date();
if(now - previous > wait){
previous = now;
func();
}
}
}
//节流2(setTimeout)
function throttle2(func,wait) {
let timer;
return function () {
if (!timer) {
timer = setTimeout(() => {
func();
timer = null; // clearTimeout(timer) 错误
}, wait);
}
}
}
</script>
<!--
1、什么是函数防抖函数防抖(debounce):就是让某个函数在上一次执行之后,满足等待某个时间内不再触发此函数后再执行,而在这个等待时间内再次触发函数,等待时间可以重新计算,知道该函数在一定间隔内没有被调用时,才开始执行被调用方法
(所谓防抖,就是指触发事件后在 n 秒内函数只能执行一次,如果在 n 秒内又触发了事件,则会重新计算函数执行时间。)
2、应用场景用户注册时候的手机号验证和邮箱验证搜索框
假设我们网站有个所搜框,用户输入文本我们会自动联想匹配出一些结果供用户选择。
我们可能首先想到到的做法就是监听keypress事件,然后异步去查询结果这个方法本事是没有错的,但是如果用户快速的输入一连串字符,假设是10个字符,就会在瞬间触发了10次请求,这无疑不是我们想要的。我们想要的是用户停止输入的时候才去触发查询的请求,这个时候函数防抖可以帮助我们。
1、什么是函数节流函数节流(throttle):是让一个函数无法在很短的时间间隔内连续调用,当上一次执行完之后过了规定的时间间隔,才能进行下一次的函数调用。
(所谓节流,就是指连续触发事件但是在N秒中只执行一次函数)节流会稀释函数的执行频率。即每间隔某个事件去执行某个函数,避免函数的过多执行,这个方式就叫函数节流
2、应用场景window对象的resize、scroll事件拖拽时候的mousemove射击游戏中的mousedown、keydown事件文字输入、自动完成的keyup事件
-->
</html>