当前位置:网站首页>不会还有人不知道防抖吧?
不会还有人不知道防抖吧?
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指向可能带来的问题。
最后
至此,这个简易的防抖函数就写完了,可能我想的还不太完善,希望大家给予建议,我也会及时学习,之后将其完善,争取做的更好。
感兴趣的朋友可以留个关注,我们一同进步!
边栏推荐
- Heap Sort
- *W3C* 标准组织
- Digital management insight into retail and e-commerce operations - retail password
- datax oracle to oracle incremental synchronization
- 【Inspirational】The importance of review
- winform 在Datatable插入一笔数据
- MySQL 45 讲 | 10 MySQL为什么有时候会选错索引?
- 小程序容器加快一体化在线政务服务平台建设
- 热成像测温的原理是什么呢?你知道吗?
- Xilinx VIVADO 中 DDR3(Naive)的使用(1)创建 IP 核
猜你喜欢

浅析深度学习在图像处理中的应用趋势及常见技巧

Graphical Hands-on Tutorial--ESP32 One-Key Network Configuration (Smartconfig, Airkiss)

学会使用set和map的基本接口

【LeetCode】700.二叉搜索树

【励志】复盘的重要性

Mysql高级篇学习总结13:多表连接查询语句优化方法(带join语句)

Leetcode brush questions - binary search tree related topics (98. Verify binary search tree, 235. The nearest common ancestor of binary search tree, 1038. From binary search tree to bigger sum tree, 5

123

Zikko launches new Thunderbolt 4 docking station with both HDMI2.1 and 2.5GbE

入门MySql表的增删查改
随机推荐
Heap Sort
数字知识库及考学一体化平台
[easyUI]修改datagrid表格中的值
网管型交换机比傻瓜交换机多了哪些功能
什么是 DevOps?看这一篇就够了!
Learn to use the basic interface of set and map
将博客搬至CSDN
Jenkins使用手册(1) —— 软件安装
使用.NET简单实现一个Redis的高性能克隆版(二)
浅析深度学习在图像处理中的应用趋势及常见技巧
深度强化学习与APS的一些感想
*iframe*
知乎数据分析训练营
【机器学习】:如何对你的数据进行分类?
使用.NET简单实现一个Redis的高性能克隆版(二)
What is the principle of thermal imaging temperature measurement?Do you know?
【励志】复盘的重要性
The use of DDR3 (Naive) in Xilinx VIVADO (2) Read and write design
datax oracle to oracle incremental synchronization
map的一道题目<单词识别>