防抖和节流

函数防抖(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>

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值