亲宝软件园·资讯

展开

Js 防抖与节流

地灵 人气:1
## Js 防抖与节流
【概述】防抖和节流算性能优化的知识,所以记录下防抖与节流,从概念、使用场景到代码的简单实现。
比如:监听滚动,基本每个网站都会有返回顶部的按钮,当用户下拉到一定高度时,会出现返回顶部按钮。那我们现在写一下这个功能代码如下:
``` function showTop() { var scrollTop = document.body.scrollTop || document.documentElement.scrollTop; console.log('滚动条位置:' + scrollTop); } window.onscroll = showTop // 滚动一下会执行 n次 ```
但是当你用鼠标滚轮进行滚动时,你会发现~~轻轻~~滚动一下,该函数会执行相当多的次数,有时候我们并不需要执行这么多的次数,只需一次即可,所以接下来是如何优化这个功能。
#### 防抖
我们可以提供一种思路,在第一次触发事件时,不立即执行函数,而是给出一个时间 500ms:如果 500ms 内没有再次触发滚动事件,那么就执行函数。如果在 500ms 内再次触发滚动事件,那么当前的计时取消,重新开始计时。代码如下:
``` /* * fn [function] 需要防抖的函数 * delay [number] 毫秒,防抖期限值 */ function debounce(fn, delay) { let timer = null; // 定义空变量 return function () { if (timer) { clearTimeout(timer); // 说明当前正在计时,并且又触发了相同事件,所以清除当前计时器。 } timer = setTimeout(fn, delay); // 反之则启动。 } } // 结合滚动函数 window.onscroll = debounce(showTop, 1000) ```
此时函数会在1秒后执行,以上就是简单的防抖,对于短时间内多次触发的事件,让它在规定时间内只触发一次。
#### 节流
如果用户不停的滚动鼠标滚轮,那么事件就永远不会触发,所以问题又出来了。
我们可以设计一个开关,函数执行一次后,在某个时间段内失效,过了这段时间再开启。
``` function throttle(fn, delay) { let flag = true return function () { if (!flag) { // 关 return false } // 开,执行函数并且在间隔期内把状态位设为无效 flag = false setTimeout(() => { fn() flag = true; }, delay) } } // 结合滚动函数 window.onscroll = throttle(showTop, 1000) ```
至此当用户持续滚动时,函数任会以1秒时间间隔来运行。
区别:中括号法可以用变量作为属性名,而点方法不可以。 中括号法可以用数字作为属性名,而点语法不可以。
#### 其他场景
比如用户搜索内容 input 事件,支持实时搜索就可以用节流,还有页面响应式大小 resize 适配大小屏,这种情况可以使用防抖,只需判断最后一次的变化值。
#### 总结
以上内容基于防抖和节流的核心思实现了简单的代码,具体的情况还要看业务逻辑。如参数传递,作用域改变等。
see you ~~

加载全部内容

相关教程
猜你喜欢
用户评论