防抖与节流

一、防抖:

指触发事后在n秒内函数只执行一次,若在n秒内再次触发则重新计算;

点击按钮 2秒后调用函数,再第1.5秒时又点了,

下拉触底加载下一页

二、节流

39滴焊锡:40  试一下38  38有的可以有的不行,然后用39

连续发生的事件在n秒内只执行一次函数

即时查询   

三、防抖优化代码

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>防抖和节流,在代码中的优化</title>
</head>
<body>

<input id="search" type="text" oninput="count()"/>
<div id="content" style="height:150px;line-height: 150px;text-align: center;"></div>
<script>

    let num=1;
    let content=document.getElementById("content");
    function count(){
        content.innerHTML=num++;
    }
    content.onmousemove=count;

    //优化:方式一:防抖debounce

    //让输入完毕过两秒再查询(延迟执行)
    function debounce(func,wait){
        let timeout;//定时器
        return function(){
            if(timeout)
            clearTimeout(timeout);//取消之前的任务
            timeout=setTimeout(function () {
                func.apply(this);//执行func函数
            },wait)

        }
    }
    content.onmousemove=debounce(count,2000);


    //方式二:让输入完毕立即查询,过2秒才能再查询(立即执行)

    function debounceQ(func,wait){
        let timeout;
        return function(){
            if(timeout)
                clearTimeout(timeout);
            let callNow=!timeout;//类型转换
            timeout=setTimeout(()=>{ //增加一个定时器
                timeout=null;//清空当前定时器
            },wait)
            if(callNow) func.apply(this);//第一次执行
        }
    }
    content.onmousemove=debounceQ(count,2000);


</script>
</body>
</html>

四、节流优化代码

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>防抖和节流,在代码中的优化</title>
</head>
<body>

<input id="search" type="text" oninput="count()"/>
<div id="content" style="height:150px;line-height: 150px;text-align: center;"></div>
<script>

    let num=1;
    let content=document.getElementById("content");
    function count(){
        content.innerHTML=num++;
    }
    content.onmousemove=count;


    //节流
   //方式一:定时器:固定的时间去发请求
    function throttle(func,wait){
        let timeout;//定义一个定时器
        return function(){
            if(!timeout)//是否存在定时器
            timeout=setTimeout(()=>{ //创建一个定时器
                timeout=null;//清空当前定时器
                func.apply(this);
            },wait)
        }
    }
    content.onmousemove=throttle(count,2000);

    //方式二:时间戳

    function throttle2(func,wait){
        let pre=0;//上次记录时间
        return function(){
            let now=Date.now();//当前时间
            if(now-pre>wait){//当前时间-上次时间》等待时间
                func.apply(this);//执行函数
                pre=now;//重置上次记录时间
            }
        }
    }
    content.onmousemove=throttle2(count,2000);

</script>
</body>
</html>

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值