javascript函数的节流throttle与防抖debounce详解

本文主要介绍了javascript函数的节流[throttle]与防抖[debounce ],详细的介绍了节流与防抖的原理和示例,具有一定的参考价值,有兴趣的可以了解一下,希望能帮助到大家。

防抖和节流

窗口的resize、scroll,输入框内容校验等操作时,如果这些操作处理函数较为复杂或页面频繁重渲染等操作时,如果事件触发的频率无限制,会加重浏览器的负担,导致用户体验非常糟糕。此时我们可以采用debounce(防抖)和throttle(节流)的方式来减少触发的频率,同时又不影响实际效果。

这两个东西都是为了项目优化而出现的,官方是没有具体定义的,他们的出现主要是为了解决一些短时间内连续执行的事件带来性能上的不佳和内存的消耗巨大等问题;

像这类事件一般像 scroll keyup mousemove resize等等,短时间内不断的触发,在性能上消耗是非常大的,尤其是一些改变DOM结构的操作;

立即学习“Java免费学习笔记(深入)”;

节流[throttle]与防抖[debounce]非常相似,都是让上述这类事件在规定的事件从不断的去触发更改成为规定的时间内触发多少次;

节流[throttle]

节流通俗来解释就比如我们水龙头放水,阀门一打开,水哗哗的往下流,这个秉着勤俭节约的优良传统美德,我们要把水龙头关小点,最好是如我们心意按照一定规律在某个时间间隔内一滴一滴的往下滴,这,,,好吧这就是我们节流的概念;

换成函数来说,使用setTimeout方法,给定两个时间,后面的时间减去前面的时间,到达我们给定的时间就去触发一次这个事件,这么说太笼统的,我们看下面的函数,这里我们以【scroll】为例;

/** 样式我就顺便写了 **/ *{padding:0;margin:0;} .scroll-box{  width : 100%;  height : 500px;  background:blue;  overflow : auto; }  .scroll-item{  height:1000px;  width:100%; }

登录后复制

————————

/** 先给定DOM结构;**/

 

登录后复制

————————

/**主要看js,为了简单我用JQ去写了**/ $(document).ready(function(){  var scrollBox = $('.scroll-box');  //调用throttle函数,传入相应的方法和规定的时间;  var thro = throttle(throFun,300);  //触发事件;  scrollBox.on('scroll' , function(){   //调用执行函数;   thro();  })  // 封装函数;   function throttle(method,time){   var timer = null;   var startTime = new Date();   return function(){    var context = this;    var endTime = new Date();    var resTime = endTime - startTime;    //判断大于等于我们给的时间采取执行函数;    if(resTime >= time){     method.call(context);     //执行完函数之后重置初始时间,等于最后一次触发的时间     startTime = endTime;    }   }  }  function throFun(){   console.log('success');  } })

登录后复制

通过以上的函数,我们就可以做到节流的效果,在规定的每300毫秒触发一次,当然时间可以自定义,根据需求来;

防抖[debounce ]

写代码之前,我们先清楚一下防抖的概念,不知道大家有没有做过电脑端两边悬浮广告窗口的这么一个东西,当我们拖动滚动条的时候,两边的广告窗口会因为滚动条的拖动,而不断的尝试着去居于中间,然后你就会看到这两个窗口,不停的抖啊抖;

一般这种就叫抖动了,我们要做的就是防止这种抖动,称为防抖[debounce ];

那这里防抖思想就是当我们拖动完成之后,两边的窗口位置再重新去计算,这样,就会显得很平滑,看着很舒服了,最主要的操作DOM结构的次数就大大减少了;

优化了页面性能,降低了内存消耗,不然你像IE这种比较老点版本的浏览器,说不定就直接给你蹦了

用书面一点的说法就是,在某个事件没有结束之前,函数不会执行,当结束之后,我们给定延时时间,然他在给定的延时时间之后再去执行这个函数,这就是防抖函数;

来看代码:

//将上面的throttle函数替换为debounce函数;function debounce(method,time){ var timer = null ; return function(){  var context = this;  //在函数执行的时候先清除timer定时器;  clearTimeout(timer);  timer = setTimeout(function(){   method.call(context);  },time); }}

登录后复制

思路就是在函数执行之前,我们先清除定时器,如果函数一直执行,就会不断的去清除定时器中的方法,知道我们操作结束之后,函数才会执行;

其实书写的方式有很多,主要还是思路的问题,大家写的多了,自然就知道了;

用途

当我们做keyup像后台请求检验的时候,可以使用防抖函数,不然我们每按一次键盘就请求一次,请求太频繁,这样当我们结束按键盘的时候再去请求,请求少很多了,性能自然不用说;

resize 窗口大小调整的时候,我们可以采用防抖技术也可以使用节流;

mousemove 鼠标移动事件我们既可以采用防抖也可以使用节流;

scroll 滚动条触发的事件,当然既可以采用防抖也可以采用节流;

连续高频发的事件都可以采用这两种方式去解决,优化页面性能;

相关推荐:

JS函数节流防抖实例详解

详解javascript函数的节流与防抖

函数节流与防抖的含义

以上就是javascript函数的节流throttle与防抖debounce详解的详细内容,更多请关注【创想鸟】其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2790696.html

(0)
上一篇 2025年3月8日 19:00:21
下一篇 2025年3月8日 19:00:30

AD推荐 黄金广告位招租... 更多推荐

相关推荐

  • PM2将Node.js的集群变得更加容易的实现方法

    本文主要介绍了详解如何使用pm2将node.js的集群变得更加容易,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧,希望能帮助到大家。 介绍 众所周知,Node.js运行在Chrome的JavaScript运行时…

    2025年3月8日
    200
  • vuejs实现本地数据的筛选分页功能

    做项目需要一份根据本地数据的筛选分页功能,下面小编把vuejs实现本地数据的筛选分页功能的实现思路分享到脚本之家平台,需要的朋友可以参考下,希望能帮助到大家。 效果图: 项目需要:点击左侧进行数据筛选,实现自动分页,自动生成页数,点击自动跳…

    2025年3月8日
    200
  • Js判断H5上下滑动方向详解

    本文主要为大家分享一篇js判断h5上下滑动方向及滑动到顶部和底部判断的示例代码,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧,希望能帮助到大家。 向上滑动隐藏底部悬浮框,向下滑动显示悬浮框。使用pc端浏览器查看请把浏览器设…

    编程技术 2025年3月8日
    200
  • IWinter一个路由转控制器的Nodejs库详解

    本文主要介绍了详解iwinter 一个路由转控制器的 nodejs 库,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧,希望能帮助到大家。 IWinter 是一个路由转控制器的 node 库,只解决一个问题:为了…

    编程技术 2025年3月8日
    200
  • js ajax同步请求造成浏览器假死的问题如何解决?

    本文主要为大家分享一篇解决js ajax同步请求造成浏览器假死的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧,希望能帮助到大家。 一、问题的起因 今天做一个需求遇到了这么个情况,就是用户个人中心有个功能,点击按钮,可…

    编程技术 2025年3月8日
    200
  • nodejs最新版安装npm的使用方法分享

    本文主要介绍了nodejs 最新版安装npm 的使用详解,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧,希望能帮助到大家。 # 安装 nodejs 以下介绍的是命令行安装方法,读者也可以到nodejs官网 上下…

    2025年3月8日
    200
  • javascript将url解析为json格式的两种方法

    本篇文章主要介绍了javascript将url解析为json格式的两种方法,具有一定的参考和学习javascript的价值,对javascript感兴趣的小伙伴们可以参考一下本篇文章 本文介绍了javascript将url解析为json格式…

    2025年3月8日
    200
  • JS模拟超市简易收银台小程序代码解析

    本文通过实例代码给大家介绍了js模拟超市简易收银台小程序代码,非常不错,具有参考和学习js的价值,对js感兴趣的的朋友参考下吧 废话不多说了,直接给大家贴代码了,具体代码如下所示:   // 1.编写一个程序,计算增加后的工资。要求基本工资…

    编程技术 2025年3月8日
    200
  • JavaScript 完成注册页面表单校验的实例

    下面小编就为大家带来一篇javascript 完成注册页面表单校验的实例。小编觉得挺不错的,现在就分享js源码给大家,也给大家做个参考。对javascript感兴趣的一起跟随小编过来看看吧 1、步骤分析 第一步:确定事件(onsubmit)…

    编程技术 2025年3月8日
    200
  • JavaScript文件的同步和异步加载的实现代码

    本篇文章主要介绍了javascript文件的同步和异步加载的实现代码,具有一定的参考和学习javascript的价值,对javascript感兴趣的可以了解一下本篇文章 对于JS文件的引用,尽管当前有不少框架和工具(比如webpack,co…

    2025年3月8日 编程技术
    200

发表回复

登录后才能评论