当前位置:网站首页>不会还有人不知道防抖吧?
不会还有人不知道防抖吧?
2022-08-04 11:13:00 【是乃德也是Ned】
前言
在我们写项目遇到不听话的用户的时候,例如一个登录按钮,他就偏偏要反复点好几次,调用了/login
接口好多次,是不是很烦?
因为涉及到ajax请求,就会有这样的情况,假设 1 秒触发了 60 次,每个回调就必须在 1000 / 60 = 16.67ms 内完成,否则就会有卡顿出现。
那么只有请求需要写防抖吗?
当然不是,凡是(可能)涉及到频繁事件触发的地方,都需要写防抖。
- window 的 resize、scroll
- mousedown、mousemove
- keyup、keydown
- click事件
- ……
我们简单的写一个小demo,看一下没有防抖跟有防抖的效果。
代码:
// html
<button id="btn" onclick="shake()">
<span id="container">点击我</span>
</button>
// js
var count = 1;
var container = document.getElementById('container');
var btn = document.getElementById('btn')
function shake() {
container.innerHTML = count++;
};
未防抖.gif
如何实现防抖
实现防抖,就要了解防抖的原理。
防抖就是,不管你触发了几次,我只看你最后触发的那一次,并且在若干时间后去执行此次事件。
根据这个原理,我们可以写出这段代码:
function preventShake(todo,time){
let timeout;
return function () {
clearTimeout(timeout)
timeout = setTimeout(todo, time);
}
}
设置一个延迟操作的事件,并且如果再次触发就把之前的延迟取消掉,重新进入计时。
将它运用在刚刚的例子上:
var count = 1;
var container = document.getElementById('container');
var btn = document.getElementById('btn')
function shake() {
container.innerHTML = count++;
};
function preventShake(todo,time){
var timeout;
return function () {
clearTimeout(timeout);
timeout = setTimeout(todo, time);
}
}
btn.onclick = preventShake(shake,1000);
防抖未优化.gif
我们已经实现了基础的它,那么我们继续优化一下吧!
this指向优化
看似上面的结果没有什么太大问题,但是我们打印一下原先的shake
和使用了preventShake
后的this就会知道,他们指向的并不是一个东西。
原先指向的是
<button id="btn">
<span id="container">点击我</span>
</button>
使用了preventShake
后this指向的是Window对象!
于是我们要加一步,就是改变this指向。
function preventShake(todo,time){
var timeout;
return function () {
var that = this;
clearTimeout(timeout);
timeout = setTimeout(function(){
todo.apply(that);
}, time);
}
}
这样就解决了this指向可能带来的问题。
最后
至此,这个简易的防抖函数就写完了,可能我想的还不太完善,希望大家给予建议,我也会及时学习,之后将其完善,争取做的更好。
感兴趣的朋友可以留个关注,我们一同进步!
边栏推荐
- Zikko launches new Thunderbolt 4 docking station with both HDMI2.1 and 2.5GbE
- 解析treeSet集合进行自定义类的排序
- 光盘刻录步骤
- Google Earth Engine APP——实现ui.Select() 的设定和条件判断
- 【LeetCode】1403.非递增顺序的最小子序列
- Super Learning Method
- Win11怎么重装显卡驱动程序?Win11显卡驱动怎么卸载重装?
- Use pytest hook function to realize automatic test result push enterprise WeChat
- SkiaSharp 之 WPF 自绘 粒子花园(案例版)
- Jenkins User Manual (1) - Software Installation
猜你喜欢
随机推荐
datax oracle to oracle离线json文件
【LeetCode】899.有序队列
3-5年以上的功能测试如何进阶自动化?
What is the terminal privilege management
面试蚂蚁(P7)竟被MySQL难倒,奋发图强后二次面试入职蚂蚁金服
Using .NET to simply implement a high-performance clone of Redis (2)
【LeetCode】98.验证二叉搜索树
章节小测一
Win11怎么重装显卡驱动程序?Win11显卡驱动怎么卸载重装?
数字知识库及考学一体化平台
Use pytest hook function to realize automatic test result push enterprise WeChat
Heap Sort
上帝空间——全球首个基于Web3.0的艺术协议创意平台,拓宽多元艺术融合边界
Camunda overall architecture and related concepts
cat /proc/kallsyms 发现内核符号表值都为0
图文手把手教程--ESP32 OTA空中升级(VSCODE+IDF)
*iframe*
Xilinx VIVADO 中 DDR3(Naive)的使用(1)创建 IP 核
Jenkins使用手册(1) —— 软件安装
RL78开发环境