防抖、节流

一、函数防抖

单位时间内,频繁触发一个事件,以最后一次触发为准。

防抖的实现:

1.声明一个全部变量存储定时器ID。

2.每一次触发交互的时候,先清除上一次的定时器,然后开启本次定时器。

例:

//防抖debounce代码:
function debounce(fn,delay) {
    var timeout = null; // 创建一个标记用来存放定时器的返回值
    return function (e) {
        // 每当用户输入的时候把前一个 setTimeout clear 掉
        clearTimeout(timeout); 
        // 然后又创建一个新的 setTimeout, 这样就能保证interval 间隔内如果时间持续触发,就不会执行 fn 函数
        timeout = setTimeout(() => {
            fn.apply(this, arguments);
        }, delay);
    };
}
// 处理函数
function handle() {
    console.log('防抖:', Math.random());
}
        
//滚动事件
window.addEventListener('scroll', debounce(handle,500));

二、函数节流

单位时间内,频繁触发一个事件,只会触发一次。

节流的实现:

1.声明一个全局变量存储触发事件。

2.每一次触发事件,获取当前时间。

3.判断当前时间与上一次触发事件,是否超过了间隔。

  1. 如果超过间隔时间,则执行事件处理代码,然后存储本次触发的时间。

使用场景:

  1. 懒加载、滚动加载、加载更多或监听滚动条位置;

  1. 百度搜索框,搜索联想功能;

  1. 防止高频点击提交,防止表单重复提交;

例:

// 时间戳方案
function throttle(fn,wait){
    var pre = Date.now();
    return function(){
        var context = this;
        var args = arguments;
        var now = Date.now();
        if( now - pre >= wait){
            fn.apply(context,args);
            pre = Date.now();
        }
    }
}
    
window.addEventListener("mousemove",throttle(handle,1000)); 

// 定时器方案
function throttle(fn,wait){
    var timer = null;
    return function(){
        var context = this;
        var args = arguments;
        if(!timer){
            timer = setTimeout(function(){
                fn.apply(context,args);
                timer = null;
            },wait)
        }
    }
}
    
function handle(){
    console.log(Math.random());
}
    
window.addEventListener("mousemove",throttle(handle,1000));
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值