事件节流函数封装层

事件节流函数封装层

 以下场景往往由于事件频繁被触发,因而频繁执行DOM操作、资源加载等重行为,导致UI停顿甚至浏览器崩溃。

  1. window对象的resize、scroll事件

  2. 拖拽时的mousemove事件

  3. 射击游戏中的mousedown、keydown事件

  4. 文字输入、自动完成的keyup事件

  实际上对于window的resize事件,实际需求大多为停止改变大小n毫秒后执行后续处理;而其他事件大多的需求是以一定的频率执行后续处理。针对这两种需求就出现了debounce和throttle两种解决办法。

二、什么是debounce                            

   1. 定义

  如果用手指一直按住一个弹簧,它将不会弹起直到你松手为止。

      也就是说当调用动作n毫秒后,才会执行该动作,若在这n毫秒内又调用此动作则将重新计算执行时间。

   接口定义:

1 /**
2 * 空闲控制 返回函数连续调用时,空闲时间必须大于或等于 idle,action 才会执行
3 * @param idle   {number}    空闲时间,单位毫秒
4 * @param action {function}  请求关联函数,实际应用需要调用的函数
5 * @return {function}    返回客户调用函数
6 */
7 debounce(idle,action)

2.简单实现

 1 var debounce = function(idle, action){
 2   var last
 3   return function(){
 4     var ctx = this, args = arguments
 5     clearTimeout(last)
 6     last = setTimeout(function(){
 7         action.apply(ctx, args)
 8     }, idle)
 9   }
10 }

三、什么是throttle                              

   1. 定义

  如果将水龙头拧紧直到水是以水滴的形式流出,那你会发现每隔一段时间,就会有一滴水流出。

  也就是会说预先设定一个执行周期,当调用动作的时刻大于等于执行周期则执行该动作,然后进入下一个新周期。

      接口定义:

1 /**
2 * 频率控制 返回函数连续调用时,action 执行频率限定为 次 / delay
3 * @param delay  {number}    延迟时间,单位毫秒
4 * @param action {function}  请求关联函数,实际应用需要调用的函数
5 * @return {function}    返回客户调用函数
6 */
7 throttle(delay,action)

   2. 简单实现

 1 var throttle = function(delay, action){
 2   var last = 0;
 3     return function(){
 4     var curr = +new Date()
 5     if (curr - last > delay){
 6       action.apply(this, arguments)
 7       last = curr 
 8     }
 9   }
10 }    

http://www.cnblogs.com/fsjohnhuang/p/4147810.html

http://www.cnblogs.com/dolphinX/p/3403821.html

http://www.admin10000.com/document/1124.html

【前端性能】高性能滚动 scroll 及页面渲染优化

转载于:https://www.cnblogs.com/suoking/p/5481808.html

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

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/109027.html原文链接:https://javaforall.net

赞 (0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • required属性的作用_required的作用

    required属性的作用_required的作用1,required属性-表示字段不能为空(注意:只有用户单击“提交”按钮提交表单的时候,浏览器才会执行验证。目前HTML5不支持指定验证的时间,而且验证消息的样式和内容各个浏览器不大一样,不能修

    2022年8月3日
  • ODT珂朵莉树「建议收藏」

    ODT珂朵莉树「建议收藏」珂朵莉树の由来珂朵莉树(或称ODT(OldDriverTree老司机树))这毒瘤算法由CodeForces-896CWillem,ChthollyandSeniorious的正解衍化而来由于其骗分暴力的非正统算法思想虽然很多时候在随机数据下跑时不错但切记这只是骗分暴力,时间复杂度上并不正确什么时候用珂朵莉树珂朵莉树一般用来解决本来应当由线段树解决的区间类问题而使…

    2022年9月10日
  • 如何用jmeter做性能测试并分析测试结果(jmeter负载测试步骤)

    Jmeter是一款轻量型的优秀测试软件产品,在很多场合如个人测试,企业测试中都有广泛应用。相比体积巨大的Lr我们在某些场合可能更倾向于对Jmeter的使用,那么我们要如何利用该软件进行性能测试呢?首先我们需要下载安装这款全免费的测试软件Jmeter,下载地址如下:http://jmeter.apache.org/download_jmeter.cgi按图中操作,下载好压缩包,解压安装即可

    2022年4月16日
  • sql 存储过程中何时使用declare声明变量[通俗易懂]

    sql 存储过程中何时使用declare声明变量[通俗易懂]这个问题我从百度第二页才找得到答案,就从别人的答案自己仔细研究懂了,顺便整理了过来。原文链接:https://zhidao.baidu.com/question/245490659799230284.html如果把存储过程看作是批处理语句就好理解多了存储过程只不过是一个带着名称的SQL批处理语句,如果在整个过程中需要变量时就是可以声明,但该变量声明后只能存活在批处理(存储过程)的…

    2022年8月20日
  • 遍历ArrayList,并删除某些元素的方法实现「建议收藏」

    遍历ArrayList,并删除某些元素的方法实现「建议收藏」本文是根据https://blog.csdn.net/qq_32575047/article/details/78902254的帖子进行整理的,在此感谢一下。题目:一个ArrayList对象aList中存有若干个字符串元素,现欲遍历该ArrayList对象,删除其中所有值为”abc”的字符串元素,请用代码实现。publicclassTest1{public…

    2022年9月30日
  • 与运算(&)、或运算(|)、异或运算(^)、进制转换

    与运算(&)、或运算(|)、异或运算(^)、进制转换参加运算的两个对象,按二进制位进行运算。进制转换地址:http://tool.oschina.net/hexconvert/一:与运算符(&)预算规则:0&0=0;0&1=0;1&0=0;1&1=1即:两个同时为1,结果为1,否则为0例如:3&5十进制3转为二进制的3:00000011十进制5转为二进制的5:0000…

    2022年5月29日

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

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