虾扯蛋之函数防抖和节流

背景

    今天在coding的时候,做了一个搜索框,也正是这个搜索框,让我和后台小伙伴直接由铁磁变为塑料兄弟。那到底发生啥了呢?其实很简单,其实很无奈,就是我用王者的手速把他的接口访问崩了!

    我们在平时开发的时候,会有很多场景会频繁触发事件,比如说搜索框实时发请求,onmousemove,resize,onscroll等等,有些时候,我们并不能或者不想频繁触发事件,咋办呢?这时候就应该用到函数防抖和函数节流了!

函数防抖(debounce)

    什么是防抖?短时间内多次触发同一个事件,只执行最后一次,或者只在开始时执行,中间不执行。举个栗子:你去乘坐公交车,不停地上人,连续上人的过程中司机师傅是不会开车的,只有当最后一个人上车了,老司机才会开车!嘿嘿嘿!我们以不停地触发onmousemove事件,让数字 1为例。代码如下:

  • 不使用防抖和节流,数字会像得了羊癫疯一样不停地增长
//变量初始化
var xcd = document.getElementById('xcd'),count = 1; 
//要执行的操作 数字 1
function doSomething() {xcd.innerHTML = count  ;
};
//触发onmousemove事件 正常情况下
xcd.onmousemove = doSomething;

  • 使用防抖之绿色基础版
//绿色基础版:
function debounce(doSomething,wait){var timeout;//需要一个外部变量,为增强封装,所以使用闭包return function(){var _this = this,_arguments = arguments;//arguments中存着eclearTimeout(timeout);timeout = setTimeout(function(){doSomething.apply(_this,_arguments);   },wait);}
}
//触发onmousemove事件
xcd.onmousemove = debounce(doSomething,1000);

    这个绿色基础版虽然简单,但是已经能够解决大部分需求场景了,没有啥特殊需求使用这个版本就行了!用起来简直像吃了巴豆一样,duangduangduang,极其通畅!But,还会有一些其他需求,比如我想立即执行,就是连续触发事件的开始时立即执行一次,后连续触发不执行,我们用isImmediate表示是否立即执行,代码如下:

  • 使用防抖之立即执行版
//立即执行版
function debounce(doSomething,wait,isImmediate){var timeout;return function(){var _this = this,_arguments = arguments;clearTimeout(timeout);if(isImmediate){var isTrigger = !timeout;timeout = setTimeout(function(){timeout = null;}, wait)isTrigger&&doSomething.apply(_this,_arguments);}else{timeout = setTimeout(function(){doSomething.apply(_this,_arguments);   },wait);}}
}
//触发onmousemove事件
xcd.onmousemove = debounce(doSomething,1000,true);

函数节流(throttle)

    什么是节流?节流是连续触发事件的过程中以一定时间间隔执行函数。节流会稀释你的执行频率,比如每间隔1秒钟,只会执行一次函数,无论这1秒钟内触发了多少次事件。

    举个栗子:你每天要喝好多水,但是你不会每喝完一口水都要去一次厕所,如果有盆友是酱紫的话,我劝你还是去医院看看吧→_→厕所看你都烦~你虽然一直在喝水,但是不会一直去厕所,通常的节奏是!喝水喝水喝水上厕所!喝水喝水喝水上厕所!虽然一直在触发,但是每隔一段时间只会执行一次操作,这就是函数节流!

  • 使用节流之时间戳版
//绿色基础版之时间戳版
function throttle(doSomething,wait){var _this,_arguments,initTime = 0;return function(){var now =  new Date();//将new date()转化为时间戳_this = this;_arguments = arguments;if(now - initTime>wait){doSomething.apply(_this,_arguments);initTime = now;}}
}
//触发onmousemove事件
xcd.onmousemove = throttle(doSomething,1000);

  • 使用节流之定时器版
//绿色基础版之定时器版
function throttle(doSomething,wait){var timeout;return function(){var _this = this;_arguments = arguments;if(!timeout){timeout = setTimeout(function(){timeout = null;doSomething.apply(_this,_arguments);},wait);};}
}
//触发onmousemove事件
xcd.onmousemove = throttle(doSomething,1000);

    同样,以上两个节流的绿色基础版也可以满足大多数需求场景啦!这两个版本有什么区别呢?时间戳版会在开始时立即执行一次,最后时间间隔内不再执行;定时器版开始时不执行,最后时间间隔内再执行一次。可以根据自己的实际需求选择合适的版本。

    当然,可能还有一些BT的产品会问你,能不能先立即执行一次,中间固定间隔时间执行,最后在执行一次呢?这就到了装B的时候了。像我这么牛X的前端,必须的啊,把两种合在一起就行了,双修什么的最喜欢了*@ο@*

  • 使用节流之双剑合璧版
//节流之双剑合璧版
function throttle(doSomething, wait) {var timeout, _this, _arguments,previous = 0;var later = function() {previous =  new Date();timeout = null;doSomething.apply(_this, _arguments)};var throttled = function() {var now =  new Date();//下次触发 doSomething 剩余的时间var remaining = wait - (now - previous),_this = this;_arguments = arguments;// 如果没有剩余的时间了if (remaining <= 0) {if (timeout) {clearTimeout(timeout);timeout = null;}previous = now;doSomething.apply(_this, _arguments);} else if (!timeout) {timeout = setTimeout(later, remaining);}};return throttled;
}
//触发onmousemove事件
xcd.onmousemove = throttle(doSomething,1000);

深入理解函数防抖和节流,合理选择防抖或节流,能解决很多帕金森疾病,实乃出门旅行,居家生活之必备良品!OK就酱,我就是我,我瞅自己都上火!不定期分享一些前端知识点和面试点,喜欢点波关注呗!

参考:https://github.com/mqyqingfeng/Blog

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/367225.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

四川省内二本计算机公立好的大学排名,四川有哪些二本院校是公立的?附四川省公立二本大学排名及分数线...

选择科目测一测我能上哪些大学选择科目领取你的专属报告>选择省份关闭请选择科目确定v>四川省内的公办大学一直以来都是历年高考生及家长关注的重点&#xff0c;本篇文章我将针对“四川省有多少所二本公立大学&#xff1f;有哪四川省内的公办大学一直以来都是历年高考生及…

NetBeans 7.4 Beta提示警告无效的异常处理

有许多例子说明Java异常处理可能比首次出现时要困难得多&#xff0c;Josh Bloch专门将一整章的《 Effective Java》 &#xff08;两个版本&#xff09;专门用于异常处理。 Java中的检查异常模型 仍然 “ 有争议” 。 我很高兴看到我最近下载的NetBeans 7.4 beta有一些提示&…

mysql5.7.17解压版安装_Windows中 MySQL5.7.17解压版安装步骤

1、先去MySQL官网下载。当前最新版是5.7.19&#xff0c;可能安装方法不同了&#xff0c;本人测试没有安装成功&#xff0c;若有安装成功的朋友&#xff0c;希望分享一下安装步骤。2、将下载的压缩包解压出来&#xff0c;然后在“MySQL解压目录”中新建“data”文件夹。如下图&a…

关于Java和Scala同步的五件事你不知道

实际上&#xff0c;所有服务器应用程序都需要在多个线程之间进行某种同步。 大多数同步工作是在框架级别为我们完成的&#xff0c;例如通过我们的Web服务器&#xff0c;数据库客户端或消息传递框架。 Java和Scala提供了许多组件来编写可靠的多线程应用程序。 这些包括对象池&am…

精读《你不知道的javascript》中卷

前言 《你不知道的 javascript》是一个前端学习必读的系列&#xff0c;让不求甚解的JavaScript开发者迎难而上&#xff0c;深入语言内部&#xff0c;弄清楚JavaScript每一个零部件的用途。本书《你不知道的javascript》中卷介绍了该系列的两个主题&#xff1a;“类型和语法”以…

撸个微信小程序的省市区选择器

起因 微信小程序虽然已经有现成的封装好的省市区选择器给开发者使用&#xff0c;然鹅不幸的是&#xff0c;微信地址库的数据和公司用的地址库数据很难一一对上&#xff0c;那就只能撸起袖子自己写个组件了。 最终效果 思维导图 主要代码 组件 region-picker.js /* region-pic…

python之路_day6

本节内容&#xff1a;面向对象编程介绍为什么要用面向对象进行开发&#xff1f;面向对象的特性&#xff1a;封装、继承、多态类、方法、引子 你现在是一家游戏公司的开发人员&#xff0c;现在需要你开发一款叫做<人狗大战>的游戏&#xff0c;你就思考呀&#xff0c;人狗作…

MUI调用原生自定义方法实现计算缓存与清空缓存

由于项目需要最近在做webapp开发用的是MUI框架&#xff0c;自己本来是做原生开发的&#xff0c;在开发的时候有一个需求是实现计算缓存和清除缓存的功能&#xff0c;原生java方法实现轻轻松松&#xff0c;网上代码一大把&#xff0c;不过是webapp倒是不好搞&#xff0c;MUI自己…

Java中的多重继承与组合vs继承

有时我写了几篇有关Java 继承 &#xff0c; 接口和组成的文章。 在这篇文章中&#xff0c;我们将研究多重继承&#xff0c;然后学习组成优于继承的好处。 Java中的多重继承 多重继承是创建具有多个超类的单个类的能力。 与其他一些流行的面向对象的编程语言&#xff08;例如C …

开源|蚂蚁金服开源AntV F2:一个专注于移动,开箱即用的可视

小蚂蚁说&#xff1a;AntV 是蚂蚁金服全新一代数据可视化解决方案&#xff0c;主要子产品包括 G2、G6、F2。此前我们已经相继发布过AntV的相关开源消息与版本迭代&#xff0c;包括《蚂蚁金服开源&#xff1a;数据驱动的高交互可视化图形语法G2》&#xff0c;《开源 | 蚂蚁金服开…

Puppeteer入门初探

本文来自网易云社区作者&#xff1a;唐钊最近在看 node 爬虫相关的一些东西&#xff0c;我记得还是很久以前常用的 node 爬虫工具还是 superagengtcherrio,他们的思路是通过发起 http 请求然后截取 respone 的内容&#xff0c;但是随着前端mvvm等框架的盛行&#xff0c;现在更多…

访问量大如何增加服务器,服务器流量过大原因及解决方法

造成网站服务器流量过大的原因&#xff1a;1.网站规模较大(比如门户网站、网络商城等)&#xff0c;即网站本身访问量需求大&#xff0c;查看网站的Page View值、Hits值、日流量都很高。2.网站页面设计不合理&#xff0c;页面中包含大图片或音频、视频文件等文件&#xff0c;导致…

关于VUE项目地图开发中大量点标记绘制一些总结

问题说明 在地图开发中&#xff0c;当地图中绘制大量的标记点后&#xff0c;无论是拖动或者缩放&#xff0c;都会感觉到明显的卡顿现象。&#xff08;一般超过800个点后就比较明显了&#xff09;.在平时的工作业务中&#xff0c;由于公司的实时监控页面需要展现5000-20000车辆…

如何使用Java 5 Executor框架创建线程池

Java 5以Executor框架的形式在Java中引入了线程池&#xff0c;它允许Java程序员将任务提交与任务执行分离。 如果要使用Java进行服务器端编程&#xff0c;则线程池是维护系统可伸缩性&#xff0c;鲁棒性和稳定性的重要概念。 对于那些不熟悉Java中的线程池或这里的线程池的概念…

使用NetBeans 7.4 beta提示进行更好的基于JUnit的单元测试

在上一篇文章中 &#xff0c;我写了NetBeans 7.4 beta中提供的提示 &#xff0c;这些提示提高了开发人员避免Java异常处理带来的讨厌的运行时问题的能力。 在本文中&#xff0c;我将研究如何使用NetBeans 7.4 beta提供的另外两个提示使单元测试在执行单元测试期间更加正确和清晰…

Web 开发中 Blob 与 FileAPI 使用简述

本文节选自 Awesome CheatSheet/DOM CheatSheet&#xff0c;主要是对 DOM 操作中常见的 Blob、File API 相关概念进行简要描述。 Web 开发中 Blob 与 FileAPI 使用简述 Blob 是 JavaScript 中的对象&#xff0c;表示不可变的类文件对象&#xff0c;里面可以存储大量的二进制编…

服务器e系列和l的区别,i.e.和 e.g.的区别和使用方法

举例说明在很多文章中都有使用过&#xff0c;我想这个对大家应该并不陌生&#xff0c;但是大家知道ie和eg的区别吗&#xff0c;他们两个都是举例子的缩写词&#xff0c;但是他们之间的区别大家知道吗&#xff0c;今天我们就来介绍下这两个举例说明的缩写词到底有什么不一样。一…

通过基于JDBC的用户存储部署Identity Server

在这篇文章中&#xff0c;我将演示如何使用JDBC用户存储配置WSO2 Identity Server。 为了演示&#xff0c;我使用的是MySQL用户存储&#xff0c;但是相同的过程也适用于任何其他JDBC用户存储。 我的环境是 操作系统– Ubuntu 12.10 Java – 1.6 WSO2是4.5.0 设置MySQL数据库…

前端路由实现原理(history)

前端路由实现&#xff08;history&#xff09; 了解&#xff1a; HTML5 history新增了两个API:history.pushState和history.replaceState 两个api都接受三个参数 状态对象&#xff08;state object&#xff09;&#xff1a;一个JavaScript对象&#xff0c;与用pushState()方法…

unity 删除服务器项目,在吗?有个支持批量构建项目的好东西推荐给你

Unity Build Server是一种全新的项目构建辅助工具&#xff0c;它可以指定硬件设备&#xff0c;专门用于构建项目版本&#xff0c;帮助工作室大规模构建项目&#xff0c;提高团队生产力。很多人在选择Unity时并不会首先考虑到项目构建问题&#xff0c;而随着项目变得更大、更复杂…