节流防抖的使用_监听滚动节流

节流防抖的使用_监听滚动节流节流防抖的使用

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全家桶1年46,售后保障稳定

什么是防抖

当事件被触发后,延迟几秒后再执行回调,如果在这几秒内事件又被触发,则重新计时。如:游戏中的回城机制,中途打断后必须要重新回城,重新读条。

应用场景

用户在输入框中连续输入一串字符时,可以通过防抖策略,只有在输入完后,才执行查询的请求,这样可以有效减少次数,节约请求资源。
例如:实现输入框的防抖

//模拟ajax请求
function ajax(content) { 
   
  console.log('ajax request ' + content);
}

let inputa = document.getElementById('unDebounce');

inputa.addEventListener('keyup', function (e) { 
   
    ajax(e.target.value);
})

Jetbrains全家桶1年46,售后保障稳定

只要按下键盘,就会触发ajax请求。从资源上来说是很浪费的行为,实际应用中,用户是输出完整的字符后才会请求。可以进行优化:

function ajax(content) { 
   
  console.log('ajax request ' + content);
}

function debounce(fun, delay) { 
   
    return function (args) { 
   
        let that = this;
        let _args = args;
        clearTimeout(fun.id);
        fun.id = setTimeout(function () { 
   
            fun.call(that, _args);
        }, delay)
    }
}
    
let inputb = document.getElementById('debounce')

let debounceAjax = debounce(ajax, 500)

inputb.addEventListener('keyup', function (e) { 
   
        debounceAjax(e.target.value)
    })

加入了防抖后,在频繁的输入时不会发送请求,只有当在指定间隔内没有输入时,才会执行函数。如果停止输入但是在指定间隔内又输入,会重新触发计时。

防抖代码

let timer; // 维护同一个timer
function debounce(fn, delay) { 
   
    clearTimeout(timer);
    timer = setTimeout(function(){ 
   
        fn();
    }, delay);
}
// 用onmousemove测试一下防抖函数:
function testDebounce() { 
   
    console.log('test');
}
document.onmousemove = () => { 
   
    debounce(testDebounce, 1000);
}
----------------------------------------------
简化后代码:
function debounce(fn, delay) { 
   
    let timer; // 维护一个 timer
    return function () { 
   
        // let _this = this; // 取debounce执行作用域的this
        let args = arguments;
        if (timer) { 
   
            clearTimeout(timer);
        }
        // timer = setTimeout(function () { 
   
        // fn.apply(_this, args); // 用apply指向调用debounce的对象,相当于_this.fn(args);
        // }, delay);
        timer = setTimeout(()=> { 
   
            fn.apply(this, args); // 用apply指向调用debounce的对象,相当于this.fn(args);
        }, delay);
    };
}


// test
function testDebounce(e, content) { 
   
    console.log(e, content);
}
var testDebounceFn = debounce(testDebounce, 1000); // 防抖函数
document.onmousemove = function (e) { 
   
    testDebounceFn(e, 'debounce'); // 给防抖函数传参
}

什么是节流

即每隔一段时间,只执行一次函数。如游戏中的点击鼠标发射子弹,连续不断点按鼠标,并不会发射更多的子弹,而是按照一定的数量连续发射。

应用场景

1 滚动加载,加载更多或滚到底部监听
2 谷歌搜索框,搜索联想功能
3 高频点击提交,表单重复提交

函数防抖与节流的比较

都可以通过使用 setTimeout 实现。目的都是降低回调执行频率,节省计算资源。

节流代码

function throttle(fn, delay) { 
   
    let timer;
    return function () { 
   
        let _this = this;
        let args = arguments;
        if (timer) { 
   
            return;
        }
        timer = setTimeout(function () { 
   
            fn.apply(_this, args);
            timer = null; // 在delay后执行完fn之后清空timer,此时timer为假,throttle触发可以进入计时器
        }, delay)
    }
}


//test
function testThrottle(e, content) { 
   
    console.log(e, content);
}
let testThrottleFn = throttle(testThrottle, 1000); // 节流函数
document.onmousemove = function (e) { 
   
    testThrottleFn(e, 'throttle'); // 给节流函数传参
}
/** * 触发完事件 n 秒内不再触发事件,n秒后再执行 * 只执行最后一次点击 * @param event * @param time * @param flag 是否立即执行 * @returns {Function} * @constructor */
export function debounce(event, time, flag) { 
   
  const interval = time || 500
  let timer = null
  // 默认立即执行
  const f = flag || true
  return function(...args) { 
   
    clearTimeout(timer)
    if (f && !timer) { 
   
      event.apply(this, args)
    }
    timer = setTimeout(() => { 
   
      event.apply(this, args)
    }, interval)
  }
}

/** * 只在单位时间内执行一次 * 第一次事件不会触发,最后一次一定触发 * @param event * @param time * @returns {Function} * @constructor */
export function throttle(event, time) { 
   
  const interval = time || 500
  let timer = null
  return function(...args) { 
   
    if (!timer) { 
   
      timer = setTimeout(() => { 
   
        timer = null
        event.apply(this, args)
      }, interval)
    }
  }
}

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/210153.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • todomvc项目_reactive vue

    todomvc项目_reactive vue所有实现代码在文章结尾处分析整个实现过程的步骤:1.显示大标题“todoMVC”在h1中引入{{msg}},在js文件中将msg赋值,从而在html中显示大标签的内容2.当没有数据时,两块模板需要隐藏,用到v-if标签。将两个模板放在一个template标签中,当items.length=0时,则v-if=false,进而两块模板隐藏。3.引入数据。将JS中写好的默认数据引入在html的每一个li标签中。4.将每个事件划分为完成/未完成。该功能用到双向数据绑定,可以在浏览器中vue模

  • poj1142_poj是什么意思

    poj1142_poj是什么意思poj1142题解

  • python 股票数据接口(深市股票什么开头)

    根据上交所2017年5月公告的文件显示,拿到L1普通行情数据授权的有112家公司,L2授权的有25家,我这里只贴出L2数据的厂家,如果想看L1的授权公司或者深交所的授权情况可以自己去查,太多了就不贴了。1.上海大智慧股份有限公司2.深圳巨灵信息技术有限公司3.浙江核新同花顺网络信息股份有限公司4.北京指南针科技发展股份有限公司5.鼎信汇金(北京)投资管理有限公司6.上海乾隆高科技有限公…

  • 安卓手机当电脑摄像头(DroidCam网盘及使用方法)

    安卓手机当电脑摄像头(DroidCam网盘及使用方法)网盘密码:7fp3最近校招笔试,没有摄像头,所以打起了手机摄像头的主意,搜了一下,网上的安装包很旧,有的用不了,使用讲的也不全,所以我从官网和Google商店重新下了一遍。安装环境:笔记本win10专业版手机小米mix2s,安卓8.0。从网盘下载文件,分别安装在电脑和手机上。打开手机端和电脑端,把手机界面DroidcamPort后的数字填在电脑上。如…

  • QFile接口详解

    QFile接口详解1、QFile::QFile()构造一个没有名字的QFile对象2、QFile::QFile(constQString&name)构造一个以name为文件名的QFile对象。注:也可以QFile::QFile(),然后调用setName()方法来实现类似动作。3、bootQFile::atEnd()const[虚函数]如果已经到达文件末尾则返回TRUE,否则返回…

  • 火星坐标系统_怎样算自己的上升星座

    火星坐标系统_怎样算自己的上升星座其原理是这样的:保密局开发了一个系统,能将实际的坐标转换成虚拟的坐标。所有在中国销售的数字地图必须使用这个系统进行坐标转换之后方可上市。这是生产环节,这种电子地图被称为火星地图。在使用环节,GPS终端

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号