防抖和节流

防抖

  • 是为了防止频繁触发的操作,在指定时间内我们让用户的行为只触发一次在第一次点击时/最后一次点击时(只能识别一次)
 function debounce(func, time, isStart) {
    //如果第一个参数不是function 直接提示错误
    if (typeof func !== 'function') throw new TypeError("func must be required and be an function!");
    //如果time不传默认300毫秒
    if (typeof time === 'boolean') {
      isStart == time;
      time = 300;
    }
    //如果time不是number类型也给他一个默认300毫秒
    if (typeof time !== "number") {
      time = 300;
    }
    //如果isStart不传默认false
    if (typeof isStart !== "boolean") isStart = false;

    var timer = null,
        result;

    return function proxy() {
      var self=this,
          param = [].slice.apply(arguments);

      //如果定时器存在,说明是触发行为是在time时间内
      if (timer) {
        //清除定时器,重新设置一个定时器
        clearTimeout(timer);
      }
      //如果isStart为true && 定时器不存在立即执行
      if (isStart && !timer) {
        result = func.apply(self,param)
      }
      timer = setTimeout(function () {
        if(timer){
          clearTimeout(timer);
          timer = null;
        }
        !isStart ? result = func.apply(self,param) : null;
      }, time)
    }
    return result;
  }

调用方法及参数说明:

 let box = document.body.querySelector(".box");
  //直接给box绑定点击事件,如果不做控制,每点击一次都会触发一次func方法
  function func(ev) {
    console.log("OK")
  }
  /*
   *参数:func,time,isStart
   *    func:回调函数,当行为触发要执行的函数
   *    time:间隔时间,在多长时间内认为 点击行为属于频繁触发
   *    isStart:在点击行为第一次触发时执行,还是最后一次点击行为触发时执行  默认false(最后一次)
   */
  box.onclick = hyg.debounce(func, 1000, false)

节流

  • 是为了降低触发的频率,能识别多次,在指定时间内多长时间触发一次
function throttle(func, time){
    //如果第一个参数不是function 直接提示错误
    if (typeof func !== 'function') throw new TypeError("func must be required and be an function!");
    //如果time不是number类型给它一个默认300毫秒
    if (typeof time !== "number") time = 300;
    var timer = null,
        createTimerDate=0,//记录创建定时器的时间
        result;
    return function proxy(){

      var nowDate = +new Date,//当前时间
          shortTime =nowDate - createTimerDate,//当前时间-定时器创建时间
          self=this,
          param = [].slice.apply(arguments);//参数处理
      //!timer定时器存在 && shortTime>=time还没到下一次执行的时间
      if(shortTime>=time && !timer){
        timer = setTimeout(function(){
          //触发要执行的函数  重新复制定时器创建时间
          createTimerDate=+new Date();
          if(timer){
            clearTimeout(timer);
            timer = null;
          }
          result = func.apply(self,param);
        },time)
      }

    }

调用方法及参数说明:

//定义滚动条滚动执行的方法
  function func(ev) {
    console.log("OK")
  }
  /*
   *参数:func,time
   *    func:回调函数,当行为触发要执行的函数
   *    time:间隔时间,隔多长时间触发一次
   */
  window.onscroll=throttle(func,300);
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值