1. 云栖社区>
  2. 博客列表>
  3. 正文

window scroll 事件处理之 “throttle” 和 “debounce”

振威 2016-11-22 15:48:04 浏览161 评论0

性能 测试 Window scroll

摘要: #window对象scroll事件处理之 throttle 和 debounce 概念请点这里 现状描述 天猫几乎所有的频道都有 下拉刷新 的逻辑。其中,品牌特卖和焕新在做下拉刷新的时候均使用了一个叫做 bottomloader 的组件。

#window对象scroll事件处理之 throttle 和 debounce 概念请点这里

现状描述

天猫几乎所有的频道都有 下拉刷新 的逻辑。其中,品牌特卖和焕新在做下拉刷新的时候均使用了一个叫做 bottomloader 的组件。该组件中采用了 throttle 方法对于连续的scroll事件所触发业务逻辑(包含数据加载)的次数进行了稀释,从原生的像素级别的滑动触发,稀释到了间隔几百毫秒触发一次,从而极大的降低了scroll事件对业务逻辑的高频触发,提高了滑动流畅度以及页面性能。

代码如下:

var detect = throttle(function(){ 
	//添加业务逻辑
}, 200);

window.addEventListener('scroll', detect, false);

function throttle(action, delay){
	 var self = this;
	 var curr = +new Date();
	 if (curr - self.last > delay){
	   action.apply(this, arguments);
	   self.last = curr ;
	 }
}
        

## 问题发现 这两个频道的测试同学做回归的时候均曾提出,当屏幕被快速滑动到底部时候,下一个Page的资源会经常加载不出来。特别是在 Chrome 模拟器中,通过鼠标拖动可以达到极快的滑动速度时,资源加载不出的情况更是发生频率很高。经排查,原因也很简单,就是由于代码中采用 throttle 方法做了节流。当使用者滑动超快,一次滑动事件的时间低于设定的节流阈值( 比如 500 毫秒),滑动事件就无法触发具体的业务逻辑,无法加载新数据。

调整方式

目前的修改办法是简单的将阈值改小,降至 100 毫秒,将数据加载不出的可能性降低。但是并不能根本的解决这个问题。因为极端情况下,100 毫秒以内的scroll事件也可以产生。同时,页面性能也会因为阈值小、scroll事件触发业务逻辑频率升高造成页面性能下降。

根本解决

个人倾向于采用 debounce 的方式,为每一个scroll事件触发的业务逻辑设定一个执行的 timeout,并将所有与前一个scroll事件间隔小于该阈值(即 timeout)的scroll事件触发的业务逻辑都进行丢弃,直到上一个事件完成后经过的时间已经超过该阈值。

代码如下:

var timer = null;
window.addEventListener('scroll', function () {
      if (typeof timer === 'number') {
          clearTimeout(timer);
      }
      timer = setTimeout(function () {
          //添加业务逻辑
      },200);
}, false);
    

如此则有:

  1. 无论用户/测试人员以多快速度滑动页面,一旦到页面底部,滑动事件均会由于页面无新内容而被迫停止。此时,采用了debounce 方式,scroll事件触发的业务逻辑确保能被执行;
  2. 丢弃与前一个scroll事件间隔小于特定阈值的后一个事件的业务逻辑,即就是对scroll事件触发业务逻辑次数进行了稀释,也同样提高了页面效率。

用云栖社区APP,舒服~

【云栖快讯】2017运维/DevOps在线技术峰会开始报名了!4月20日晚8点,独家直播,从底层思维到实践,运维干货一次性释放,详解运维人在新时代的思考和实践!  详情请点击

网友评论

全球领先的SaaS性能测试平台,具有强大的分布式压测能力,可模拟海量用户真实的业务场景,让应用性能问题无所遁形。

业内领先的面向企业的一站式研发提效平台,通过项目流程管理和专项自动化提效工具,能够很好地支持互联网敏捷项目的快速...

提供一种性能卓越、稳定、安全、便捷的计算服务,帮助您快速构建处理能力出色的应用,解放计算给服务带来的压力,使您的...

为您提供简单高效、处理能力可弹性伸缩的计算服务,帮助您快速构建更稳定、安全的应用,提升运维效率,降低 IT 成本...
开年采购季,惊喜不间断!

开年采购季,惊喜不间断!