原生JS的debounce和throttle

适用场景举例

1.input输入框自动补全

2.windowresize事件

3.跟踪鼠标

4.DOM 元素动态定位

封好的方法:(转载)

/*
    * 频率控制 返回函数连续调用时,fn 执行频率限定为每多少时间执行一次
    * @param fn {function}  需要调用的函数
    * @param delay  {number}    延迟时间,单位毫秒
    * @param immediate  {bool} 给 immediate参数传递false 绑定的函数先执行,而不是delay后后执行。
    * @return {function}实际调用函数
    */
    var throttle = function (fn,delay, immediate, debounce) {
       var curr = +new Date(),//当前事件
           last_call = 0,
           last_exec = 0,
           timer = null,
           diff, //时间差
           context,//上下文
           args,
           exec = function () {
               last_exec = curr;
               fn.apply(context, args);
           };
       return function () {
           curr= +new Date();
           context = this,
           args = arguments,
           diff = curr - (debounce ? last_call : last_exec) - delay;
           clearTimeout(timer);
           if (debounce) {
               if (immediate) {
                   timer = setTimeout(exec, delay);
               } else if (diff >= 0) {
                   exec();
               }
           } else {
               if (diff >= 0) {
                   exec();
               } else if (immediate) {
                   timer = setTimeout(exec, -diff);
               }
           }
           last_call = curr;
       }
    };
    
    /*
    * 空闲控制 返回函数连续调用时,空闲时间必须大于或等于 delay,fn 才会执行
    * @param fn {function}  要调用的函数
    * @param delay   {number}    空闲时间
    * @param immediate  {bool} 给 immediate参数传递false 绑定的函数先执行,而不是delay后后执行。
    * @return {function}实际调用函数
    */
    var debounce = function (fn, delay, immediate) {
       return throttle(fn, delay, immediate, true);
    };


举个例子:

html代码:

<input id="ipt"/>

js代码:

var ipt = document.getElementById('ipt');
    var ipt_input = throttle(function(){
        console.log(this.value + ':' + new Date());
    },2000, true, true);
    window.onload = function(){
        addLister(ipt,'input',ipt_input);
    }
    function addLister(el,e,h){
        if(!el) return false;
        return el.addEventListener && el.addEventListener(e,h,true) || el.attachEvent && el.attachEvent(e,h);
    }
    function rmListener(el,e,h){
        if(!el) return false;
        return el.addEventListener && el.removeEventListener(e,h,true) || el.detachEvent && el.detachEvent(e,h);
    }

拓展知识:

    var resizeTimer=null;
    $(window).on('resize',function(){
           if(resizeTimer){
               clearTimeout(resizeTimer)
           }
           resizeTimer=setTimeout(function(){
               console.log("window resize");
           },400);
       }
    );

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值