性能优化之节流、防抖

1. 防抖:

  • 由于dom操作极其昂贵,所以尝试过多的dom操作有可能会将浏览器搞崩溃,比如onresize、onscroll这类事件操作;
  • 为了解决这个问题,引出防抖的概念(某些代码不可以在没有间断的情况下连续重复执行);
  • 方案:第一次调用函数创建一个定时器,在指定时间之后执行代码;在第二次调用时,清除掉前一次的定时器并重新设置一个;
  • 这种方案下,如果第一个定时器已经执行,这个操作就没意义;如果第一个没执行,则将其替换为新的定时器;目的是只有在执行函数的请求停止一段时间后才执行;
  • 适用于代码是周期执行的,但是你不能控制请求执行的速率;
  • 函数防抖让一个函数只有在你不断触发后停下来歇会才开始执行,中间你操作得太快它直接无视。
    // 函数防抖
    function debounce(method, context) {clearTimeout(method.tid);  // mthod是真实要执行的函数,context是执行的作用域(默认window)method.tid = setTimeout(function() {method.call(context)   // 确保方法在适当的环境中执行}, 100);
    }// onscroll时函数防抖
    function scrollFun() {var marginBot = 0;if (document.documentElement) {marginBot = document.documentElement.scrollHeight - (document.documentElement.scrollTop+document.body.scrollTop) - document.documentElement.clientHeight;} else {marginBot = document.body.scrollHeight - document.body.scrollTop - document.body.clientHeight;}if(marginBot <= 0) {// 滚动到底部加载数据操作
        }
    }
    window.onscroll = function() {debounce(scrollFun);
    }

     

2. 节流

  • 如果我们不希望每次都是要事件结束后等待延迟时间后执行回调;
  • 我们可以先给定一个时间段duration,过了这个时间段以后我们执行相应的操作;如果没有过这个时间段,那么就按照函数节流的思路,开关定时器就ok。

function throttle(method, delay, duration){var timer = null, stime = new Date();          // 记录下开始执行函数的时间return function() {var context = this, args = arguments,ctime = new Date();   // 记录下当前时间
        clearTimeout(timer);     // 函数节流里的思路// 记录下的两个时间相减再与duration进行比较if (ctime - stime >= duration) {method.apply(context, args);stime = ctime;}}
}window.onresize = throttle(method, 50, 100);
// 50ms的间隔内连续触发的调用,后一个调用会把前一个调用的等待处理掉,但每隔100ms至少执行一次

3. 滚动实例区分下:

    normal:滚动会立即触发事件执行;

    throttle: 延迟100ms直到100ms以内没有事件触发之后执行,这样如果一直在操作,有可能一直不会触发事件发生;

    debounce:50ms的间隔内连续触发的调用,后一个调用会把前一个调用的等待处理掉,但每隔100ms至少执行一次。

4. 滚动到目标节点:

  • 获取目标节点偏移量var len = $('target').offset().top或document.querySelector('target').offsetTop;
  • 滚动$('body').animate(scrollTop: len)或document.querySelector('body').scrollTop = len;

转载于:https://www.cnblogs.com/colima/p/7163057.html

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

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

相关文章

百万用户规模的系统如何扩展

摘要&#xff1a;系统扩展一直是个让人头疼的事情&#xff0c;MatinKleppmann通过本文分享了他自己的6条经验&#xff0c;外加网友的一条建议&#xff0c;这些经验对于扩展Twitter这样规模的系统或许帮助不大&#xff0c;但是对于百万用户级别的系统扩展就另当别论了。 【编者…

springboot 项目输出 sql 到控制台、 SpringBoot 中 Mybatis 打印 sql

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 SpringBoot中Mybatis打印sql 如果使用的是 application.properties 文件&#xff0c;加入如下配置&#xff1a; logging.level.com.ex…

JS流程图解决方案GoJS

GoJs简介 一个实现交互类图表&#xff08;比如流程图&#xff0c;树图&#xff0c;关系图&#xff0c;力导图等等&#xff09;的JS库 GoJS依赖于HTML5&#xff0c;所以请保证您的浏览器版本支持HTML5&#xff0c;当然还要加载这个库。 首先个人建议先下载官方实例的 离线版本【…

VUE.JS 组件化开发实践

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 前言 公司目前制作一个H5活动&#xff0c;特别是有一定统一结构的活动&#xff0c;都要码一个重复的轮子。后来接到一个基于模板的活动…

Space Time Varying Color Palette

PDF Space Time Varying Color Palettes from Bo Zhou转载于:https://www.cnblogs.com/Jedimaster/p/4941857.html

提升开发效率的十个工具

Git 之前也有过不少版本控制的工具。有好的&#xff0c;也有糟糕的。不过它们都或多或少地误入歧途了。 这时候Git出现了。一旦你用上了这个神奇的工具&#xff0c;很难相像你还会碰到比它更好的了。 还没用过Git&#xff1f;试一下吧。 Stack Overflow 真的&#xff0c;我没…

Virtual Villagers 攻略

和大家分享一下这个游戏的攻略心得,希望对大家有帮助~~Puzzle 1 清洁水井&#xff08;难度&#xff1a;简单&#xff09;将一个拥有Building技能的村民拖到水井上就可以了。Puzzle 2 房屋建设&#xff08;难度&#xff1a;简单&#xff09;一开始会由一个掌握Building技能的村民…

input 框 去掉下面的提示文字、提示选项

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 1. 我的一个输入框总是有提示文字&#xff1a; 2. 去掉方法&#xff0c;给 input 加一个属性&#xff1a; autocomplete"off"…

科学合理的减肥

1、科学安排一日三餐    在正常生理情况下&#xff0c;一般人习惯于一日三餐。人体最大消耗是在一天中的上午。由于胃经过一夜消化早已排空&#xff0c;如果不吃早饭&#xff0c;那么整个上午的活动所消耗的能量完全要靠前一天晚餐提供&#xff0c;这就远远不能满足营养需要。…

解决: VUE 项目中表单提交中文乱码、接口请求参数中文乱码

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 1. 表单提交出现乱码&#xff1a; 接口请求乱码同于上图。 2. 解决&#xff1a; 在出现乱码的内容外面加函数&#xff1a;decodeURI()…

大数据 — Hadoop

HDFS Hadoop 1.0: 3个组件&#xff1a; NamenodeSecondNamenodeDatanodenamenode&#xff08;主节点&#xff0c;master&#xff0c;只有一个&#xff0c;单点故障的风险&#xff09;中间存储信息&#xff08;元数据&#xff09; 2种映射关系&#xff1a; path -> blockid l…

VUE:兄弟组件间传参

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 1、定义一个中间 eventBus.js &#xff0c;只有 2 行代码&#xff0c;用于传参&#xff1a; // 此页面是vue 巴士&#xff0c;用于兄…

C++的历史

本文由 伯乐在线 - honpey 翻译自 Albatross。欢迎加入 技术翻译小组。转载请参见文章末尾处的要求。C的历史可以追溯到1979年&#xff0c;当时Bjarne Stroustrup&#xff08;译者注&#xff1a;C之父&#xff09;正在准备他的博士毕业论文&#xff0c;他有机会使用一种叫做Si…

asp.net ajax的学习第一篇

自己理解的asp.net ajax的核心思想&#xff1a; javascript 调用web service <?xml:namespace prefix o ns "urn:schemas-microsoft-com:office:office" />由于工作的原因&#xff0c;要在自己的网页上使用无刷新技术&#xff0c;增加客户体验。开始学习asp…

insertSelective 和 insert 的区别

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 1、selective的意思是&#xff1a;选择性。 2、insertSelective--选择性保存数据&#xff1b; 比如User里面有三个字段:id&#xff0c;n…

病从口入 这样吃小心癌症找上门

肿瘤专家估计&#xff0c;大约有35%的致癌物质是经过饮食&#xff0c;30%是经过吸烟侵入体内的。仅此两项已经占了致癌因素入侵人体的一半以上了。所以说&#xff0c;预防肿瘤&#xff0c;饮食首当其冲&#xff0c;第一步就要从入口的食物谈起。 食管癌&#xff1a;腌制的咸…

VUE插件总结

UI组件 element - 饿了么出品的Vue2的web UI工具套件Vux - 基于Vue和WeUI的组件库mint-ui - Vue 2的移动UI元素iview - 基于 Vuejs 的开源 UI 组件库Keen-UI - 轻量级的基本UI组件合集vue-material - 通过Vue Material和Vue 2建立精美的app应用muse-ui - 三端样式一致的响应式 …

解决:No goals have been specified for this build. You must specify a valid lifecycle phase or a goal i

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 1. 执行打包命令报错&#xff1a; No goals have been specified for this build. You must specify a valid lifecycle phase or a goa…

十个好习惯帮你理财省大钱

理财和收入高低其实是没有关系的&#xff0c;仅和生活习惯相关。有了好的理财方法&#xff0c;也可以攒下自己的钱&#xff0c;达到财务自由的境界。下面是一些理财的技巧? 1、定时积极的存款 怎样开源节流是理财的第一步。增加收入来源&#xff0c;算好该存的钱&#xff0…

生成随机码,保存随机文件.

PrivateFunction GetRandomizeNo()Function GetRandomizeNo() As Integer 功能说明:生成随机验证码 Dim RandomizeNo As Integer Randomize() RandomizeNo 9999 * Rnd() 1000 If (RandomizeNo).ToString.Length > 5 Then R…