问题

scroll事件在文档或文档元素滚动时触发,主要出现在用户拖动滚动条。

window.addEventListener('scroll', callback);

该事件会连续地大量触发,所以它的监听函数之中不应该有非常耗费计算的操作。

解决方案

推荐的做法是使用requestAnimationFramesetTimeout控制该事件的触发频率,然后可以结合customEvent抛出一个新事件。

requestAnimationFrame()

  var throttle = function (type, name, obj) {var obj = obj || window;var running = false;var func = function () {if (running) { return; }running = true;requestAnimationFrame(function() {obj.dispatchEvent(new CustomEvent(name));running = false;});};obj.addEventListener(type, func);};// 将 scroll 事件重定义为 optimizedScroll 事件throttle('scroll', 'optimizedScroll');
})();window.addEventListener('optimizedScroll', function() {console.log('Resource conscious scroll callback!');
});

上面代码中,throttle函数用于控制事件触发频率,requestAnimationFrame方法保证每次页面重绘(每秒60次),只会触发一次scroll事件的监听函数。也就是说,上面方法将scroll事件的触发频率,限制在每秒60次。具体来说,就是scroll事件只要频率低于每秒60次,就会触发optimizedScroll事件,从而执行optimizedScroll事件的监听函数。

setTimeout()

setTimeout方法,可以放置更大的时间间隔。

(function() {window.addEventListener('scroll', scrollThrottler, false);var scrollTimeout;function scrollThrottler() {if (!scrollTimeout) {scrollTimeout = setTimeout(function () {scrollTimeout = null;actualScrollHandler();}, 66);}}function actualScrollHandler() {// ...}
}());

上面代码中,每次scroll事件都会执行scrollThrottler函数。该函数里面有一个定时器setTimeout,每66毫秒触发一次(每秒15次)真正执行的任务actualScrollHandler

throttle

function throttle(fn, wait) {var time = Date.now();return function() {if ((time + wait - Date.now()) < 0) {fn();time = Date.now();}}
}window.addEventListener('scroll', throttle(callback, 1000));

上面的代码将scroll事件的触发频率,限制在一秒一次。

lodash函数库提供了现成的throttle函数,可以直接使用。

window.addEventListener('scroll', _.throttle(callback, 1000));

知识拓展
debouncethrottle的却别

throttle是“节流”,确保一段时间内只执行一次,而debounce是“防抖”,要连续操作结束后再执行。以网页滚动为例,debounce要等到用户停止滚动后才执行,throttle则是如果用户一直在滚动网页,那么在滚动过程中还是会执行。

防止监听scroll 事件影响页面性能相关推荐

  1. react取消监听scroll事件

    如果要移除事件addEventListener的执行函数必须使用外部函数而不能直接使用匿名函数 错误写法: // 这样写是移除不了滚动事件的 componentDidMount() {// 添加滚动监 ...

  2. onscroll事件没有响应的原因以及vue.js中添加onscroll事件监听的方法(vue上监听scroll事件

    在vue.js中直接使用onscroll不起作用 利用DOM二级监听事件即可, window.addEventListener('scroll',()=>{console.log(window. ...

  3. javascript事件监听与事件委托

    事件监听与事件委托 在js中,常用到element.addEventListener()来进行事件的监听.但是当页面中存在大量需要绑定事件的元素时,这种方式可能会带来性能影响.此时,我们可以用事件委托 ...

  4. 监听滚动事件 实现动态锚点

    前几天做项目的时候,需要实现一个动态锚点的效果 如果是传统项目,这个效果就非常简单.但是放到 Vue 中,就有两大难题: 1. 在没有 jQuery 的 animate() 方法的情况下,如何实现平滑 ...

  5. js如何监听元素事件是否被移除_JavaScript 监听元素是否进入/移出可视区域

    JavaScript 监听元素是否进入/移出可视区域 常规操作 防抖节流 IntersectionObserver 兼容的代码 常规操作 通常的做法是,监听srcoll事件,根据元素的offset来判 ...

  6. 页面滚动到某一位置吸顶_vue监听滚动事件某元素吸顶或固定位置显示详解

    本文主要为大家详细介绍了vue实现某元素吸顶或固定位置显示,监听滚动事件,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能帮助到大家. 最近写了一个VUE的web app项目,需要实现某个部位 ...

  7. vue @scroll 监听滚动条事件

    vue @scroll 监听滚动条事件 为啥要使用 @scroll 监听滚动条事件 没用在vue.js 开发前 我们监听滚动条事件都是在window挂监听事件 例如:window.onscroll = ...

  8. html页面滚动条监听事件,jquery如何监听滚动条事件?

    jquery如何监听滚动条事件?下面本篇文章给大家介绍一下.有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助. 问题: 在浏览很多网页中都会发现,当滚动条滚动到一定的位置的时候就出显示一 ...

  9. html监听页面滚动高度,jquery如何监听滚动条事件?

    jquery如何监听滚动条事件?下面本篇文章给大家介绍一下.有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助. 问题: 在浏览很多网页中都会发现,当滚动条滚动到一定的位置的时候就出显示一 ...

  10. js 监听 安卓事件_百行代码实现js事件监听实现跨页面数据传输

    百行代码实现js事件监听实现跨页面数据传输 使用场景 类似消息队列的使用场景,支持同页面和跨页面通信,发送消息和接收消息 技术原理 跨页面通信: 基于事件监听,通过监听 storage事件监听回调机制 ...

最新文章

  1. SQL Server 索引和表体系结构(聚集索引)
  2. aspnetcore.webapi实践k8s健康探测机制 - kubernetes
  3. 转:大型网站架构系列:负载均衡详解(2)
  4. 入门 | 使用 SQL 构建一个关系数据库比你想的更容易
  5. C++ 智能指针unique_ptr的简单实现
  6. android imageview 半透明,如何将半透明视图叠加到ImageView上?
  7. 什么是分布式操作系统?有哪些优缺点?
  8. 第九节 初始模块结构图的设计
  9. 使用GLAD加载OpenGL的库
  10. 芝诺数解|「十三」一菜一格,百菜百味——重庆川菜数据分析报告
  11. 关于Ubuntu14.04拼音不能正常使用的解决方案
  12. 【SpringBoot】Error creating bean with name ‘methodValidationPostProcessor‘ defined in class path reso
  13. 测试普通话水平的软件,求测试普通话标准的软件?6款普通话软件推荐
  14. chinapay支付接口php,PHP/Java Bridge实现ecshop的chinapay支付接口方法(2)
  15. swing图形用户界面设计
  16. 学习第一天——ipfs安装与使用
  17. “请输入的月份“判断季节
  18. 四年级计算机考试反思,四年级期中考试反思的作文
  19. 信息检索(基础知识一)——词项-文档关联矩阵及倒排索引构建
  20. [radius] Acct-Terminate-Cause

热门文章

  1. oracle性能检测sql语句
  2. 项目是如何完成的(一)
  3. ADO.NET Entity Framework中的并发控制 【转载】
  4. http 请求头回显
  5. ADT-bundle(Android Development Tools)环境配置
  6. C#ToString() 格式化数值
  7. 【原译】什么是TCHAR,WCHAR,LPSTR,LPWSTR,LPCTSTR.等等
  8. 3.高性能MySQL --- 服务器性能剖析
  9. 一个GUI程序究竟会有几个线程?
  10. 浅入浅出 Java 排序算法