JS 中防抖&节流

防抖

触发高频事件后 n 秒内只会执行一次,如果 n 秒内再次触发,则重新计算

  • 思路
    • 每次触发事件存一个定时器;
    • 每次触发前,先清空之前的定时器.
    • 实现上次事件未触发,就不去触发,清空.执行之后的事件
function debounce(fn){
    let timeout = null;
    return function(){
        clearTimeout(timeout);
        timeout = setTimeout(()=>{
            fn.apply(this,arguments)
        },500)
    }
}

function sayHi(){
    console.log('Hi~ o(* ̄▽ ̄*)ブ')
}

var inp = document.getElementById('inp');
inp.addEventListener('input', debounce(sayHi));

节流

高频触发事件,在 n 秒内只会执行一次,多次触发不会多次执行

  • 思路
    • 每次触发事件前,判断是否之前的事件已完成,如果完成,就不继续了
function throttle(fn){
    let canRun = true;
    retrun function(){
        if(!canRun) return ; //判断上次事件是否执行完毕
        canRun = false; //执行事件 ,置为 false
        setTimeout(()=>{
            fn.apply(this,arguments);
            canRun = true; // 执行结束够,置为 true,允许下次触发执行
        },500);
    }
}

function sayHi(e){
    console.log(e.target.innerWidth, e.target.innerHeight);
}

window.addEventListener('resize', throttle(sayHi));
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 在进行窗口的resize、scroll,输入框内容校验等操作时,如果事件处理函数调用的频率无限制,会加重浏览器的负...
    iqing2012阅读 818评论 0 1
  • 1. 防抖与节流出现的背景 在日常搬砖中我们都会发现JS有很多高频率触发的事件,比如scroll、mouseove...
    zpkzpk阅读 3,416评论 1 6
  • 国家电网公司企业标准(Q/GDW)- 面向对象的用电信息数据交换协议 - 报批稿:20170802 前言: 排版 ...
    庭说阅读 11,242评论 6 13
  • 生日快乐,乐往直前 今天是我的生日,我认真地对自己说声“生日快乐,乐往直前”。每一年,这一天,都是我特别期待的一天...
    秋之燕阅读 754评论 0 0
  • 世界上有许多著名的各色星级酒店,比如极尽奢华的迪拜帆船酒店,拥有专属海滩的雅典 Grand Resort Lago...
    井涛阅读 552评论 0 0