1 .认识节流throttle函数

节流的过程

  • 当事件触发时,会执行这个事件的响应函数;
  • 如果这个事件会被频繁触发,那么节流函数会按照一定的频率来执行函数;
  • 不管在这个中间有多少次触发这个事件,执行函数的频繁总是固定的;

    节流的应用场景:

    • 监听页面的滚动事件;
    • 鼠标移动事件;
    • 用户频繁点击按钮操作;
    • 游戏中的一些设计;
游戏理解: 节流就是英雄CD
生活理解: 坐电梯时每一层的到达时间

2. Underscore实现节流

<!-- //第三方库使用防抖节流 --><input type="text"><script src="https://cdn.jsdelivr.net/npm/underscore@1.13.1/underscore-umd-min.js"></script><script>const inputEl = document.querySelector('input')let count = 0const inputChange = function (event) {count++console.log(`发送了我们的第${count}次网络请求`, this,event);}// // 防抖只执行一次// inputEl.οninput=_.debounce(inputChange,2000)// 节流固定的时间进行触发inputEl.oninput = _.throttle(inputChange, 2000)

3 手写节流

  • 图解节流的实现

3. 1节流函数的基本实现

<!-- //第三方库使用防抖节流 --><input type="text"><button id="cancel">取消</button><!-- <script src="https://cdn.jsdelivr.net/npm/underscore@1.13.1/underscore-umd-min.js"></script> --><script>const inputEl = document.querySelector('input')let count = 0const inputChange = function (event) {count++console.log(`发送了我们的第${count}次网络请求`, this, event);}// 节流固定的时间进行触发inputEl.oninput = throttle(inputChange, 2000)// 封装节流  :关键在于: 节流阀 以及时间间隔function throttle(callback, times) {let lastTime=0   //初始值//  在接受这两个值时需要返回一个函数const _throttle = function (...args) {// 获取当前时间的秒数const nowTime=new Date().getTime() // 2-(无穷大-0)=-数 执行// 2.2.使用当前触发的时间和之前的时间间隔以及上一次开始的时间, 计算出还剩余多长事件需要去触发函数const remainTime= times-(nowTime- lastTime) if (remainTime<=0) { callback.call(this,args)// 重新赋值后 times还是2s不调用callback节流阀函数 lastTime=nowTime      //第二次执行的初始时间(保留上次触发的时间)}}return _throttle}

优化

<input type="text"><button id="cancel">取消</button><!-- <script src="https://cdn.jsdelivr.net/npm/underscore@1.13.1/underscore-umd-min.js"></script> --><script>const inputEl = document.querySelector('input')let count = 0const inputChange = function (event) {count++console.log(`发送了我们的第${count}次网络请求`, this, event);}// 节流固定的时间进行触发inputEl.oninput = throttle(inputChange, 2000)// 封装节流  :关键在于: 节流阀 以及时间间隔//1 如果不触发函数则节流阀关闭状态// 当你触发这个函数时先把节流阀关闭 然后在默认的时间间隔中打开function throttle(callback, delaytime) {let state=true   //节流阀打开return function(){if (!state) {  //当节流阀关闭,则直接退出该函数return;         //callback不执行}else{//如果节流阀打开先把节流阀关闭//然后设置时间间隔后在自动打开state = false       setTimeout(() => {callback && callback()state = true}, delaytime)}}}</script>

后期优化
优化一:节流最后一次也可以执行
优化二:优化添加取消功能
优化三:优化返回值问题

JS 封装节流(后期优化)相关推荐

  1. vue自定义指令封装节流_Vue自定义指令封装节流函数的方法示例

    节流函数是web前端开发中经常用到的一个开发技巧,在input实时搜索,滚动事件等,为了避免过多消耗性能,我们都会使用节流函数.在<JavaScript高级程序设计>一书中有这样的一个例子 ...

  2. itwangyang - 再次继续卷起来-20 个 JS 封装工具函数

    itwangyang - 再次继续卷起来-20 个 JS 封装工具函数 前言 日常开发中,面对各种不同的需求,我们经常会用到以前开发过的一些工具函数,把这些工具函数收集起来,将大大提高我们的开发效率. ...

  3. python处理svg 平移 旋转_d3.js封装文本实现自动换行和旋转平移等功能

    我们下面话不多说,本文主要介绍的是利用D3.js封装文本实现自动换行功能的步骤,下面来一起看看吧. 一.引用 multext.js 文件 multext.js function appendMulti ...

  4. 小程序promise封装post请求_微信小程序 es6-promise.js封装请求与处理异步进程

    微信小程序 es6-promise.js封装请求与处理异步进程 下载es6-promise.js置于根目录下的libs文件夹下: 在根目录utils文件夹下新建httpsPromisify.js,即定 ...

  5. 原生JS封装Ajax插件(同域jsonp跨域)

    2019独角兽企业重金招聘Python工程师标准>>> 抛出一个问题,其实所谓的熟悉原生JS,怎样的程度才是熟悉呢? 最近都在做原生JS熟悉的练习... 用原生Js封装了一个Ajax ...

  6. 原生Js封装的弹出框-弹出窗口-页面居中-多状态可选

    实现了一下功能: 1.title可自定义 可拖拽 2.width height可以自定义 3.背景遮罩和透明度可以自定义 4.可以自己编辑弹出框里的html 5.确定 取消按钮可选 调用方法: 1 P ...

  7. 使用NW.js封装微信公众号菜单编辑器为桌面应用

    开发微信公众号的朋友都会遇到一个常见的需求就是修改自定义菜单,如果每个人都去开发这个不经常使用的功能确实有点浪费时间.前段时间在github上找到一个仿企业号的菜单编辑界面,结合微信的C# SDK开发 ...

  8. 原生js封装table表格操作,获取任意行列td,任意单行单列方法

    V1.001更新增加findTable-min.js 本次更新,优化了代码性能方面,增加了部分新功能,可以获取多个table表格批量操作. 考虑到本人后面的项目中可能涉及到大量的表格操作,提前先封了 ...

  9. JS日历控件优化(增加时分秒)

    JS日历控件优化  在今年7月份时候 写了一篇关于 "JS日历控件" 的文章 , 当时只支持 年月日 的日历控件,现在优化如下:      1. 在原基础上 支持 yyyy-mm- ...

最新文章

  1. SAP RETAIL 根据Allocation Rule去创建分配表
  2. “毕业”式裁员的祖宗?
  3. xstream 数字映射不上去_6个做端口映射的步骤,外网访问内网,菜鸟也能做?
  4. [渝粤教育] 中国传媒大学 政治传播学 参考 资料
  5. 国足 国奥 国青有什么区别
  6. Selenium自动化测试WebDriver下载
  7. Kafka 配置参数汇总及相关说明
  8. python控制键盘游戏内无效_关于python的游戏《兔子和獾》代码写到用键盘输入WASD控制兔子移动时,兔子移动不了。但是。。。...
  9. R语言大作业(全国2000-2019年人口各项数据分析)
  10. xshell6上传文件到linux,xshell上传文件到虚拟机中
  11. English语法_分词用法-作名词
  12. 深富策略:“石化双雄”爆发 市场不确定性增大
  13. 类的继承——cancas绘制五彩小球
  14. Kotlin入门与进阶:语法(二)类成员,运算符,语句,表达式
  15. pip安装第三方包出现ssl错误的解决方法
  16. allegro ARTWORK设置笔记
  17. 今日头条2018校招后端方向(用户喜好)c++
  18. 服务器put请求获取不到参数
  19. 安卓分屏模式的简单适配
  20. lustre lnet

热门文章

  1. DES加密和解密工具,可以对字符串进行加密和解密操作
  2. 荣耀品牌全面升级背后:以战代守,深蹲起跳
  3. PHP获取客户端真实IP地址的方法
  4. 什么是MVCC机制?
  5. [Python]scrapy爬取当当网书籍相关信息
  6. 怎么导出mysql数据库注释_数据库基础:如何查看并导出数据表中字段的注释信息...
  7. 跟着官网学k8s-04使用Service暴露您的应用
  8. wxpython中grid控件一些用法总结
  9. 工信部软件测试工程师与软考的区别,软考资格证书与职称证书的区别与联系
  10. 东南融通 可以去么?