js的防抖与节流

LinMeng 等级 634 0 0
标签: scroll前端

在进行窗口的resize、scroll,输入框内容校验等操作时,如果事件处理函数调用的频率无限制,会加重浏览器的负担,导致用户体验非常糟糕。

此时我们可以采用debounce(防抖)和throttle(节流)的方式来减少调用频率,同时又不影响实际效果。

函数防抖

函数防抖(debounce):当持续触发事件时,一定时间段内没有再触发事件,事件处理函数才会执行一次,如果设定的时间到来之前,又一次触发了事件,就重新开始延时。

如下,持续触发scroll事件时,并不执行handle函数,当1000毫秒内没有触发scroll事件时,才会延时触发scroll事件。

function debounce(fn, wait) {
    var timeout = null;
    return function() {
        if(timeout !== null) clearTimeout(timeout);
        timeout = setTimeout(fn, wait);
    }
}
// 处理函数
function handle() {
    console.log(Math.random());
}
// 滚动事件
window.addEventListener('scroll', debounce(handle, 1000));

下面这种写法会更好理解一点

var resizeTimer;
window.onresize = function() {
    if (resizeTimer) clearTimeout(resizeTimer);
    resizeTimer = setTimeout(function() {
        console.log(Math.random());
    }, 500);
};

函数节流

函数节流(throttle):当持续触发事件时,保证一定时间段内只调用一次事件处理函数。

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

如下,持续触发scroll事件时,并不立即执行handle函数,每隔1000毫秒才会执行一次handle函数。

var throttle = function(func, delay) {
    var prev = Date.now();
    return function() {
        var context = this;
        var args = arguments;
        var now = Date.now();
        if (now - prev >= delay) {
            func.apply(context, args);
            prev = Date.now();
        }
    }
}
function handle() {
    console.log(Math.random());
}
window.addEventListener('scroll', throttle(handle, 1000));

总结

函数防抖:将几次操作合并为一此操作进行。原理是维护一个计时器,规定在delay时间后触发函数,但是在delay时间内再次触发的话,就会取消之前的计时器而重新设置。这样一来,只有最后一次操作能被触发。 函数节流:使得一定时间内只触发一次函数。原理是通过判断是否到达一定时间来触发函数。 区别: 函数节流不管事件触发有多频繁,都会保证在规定时间内一定会执行一次真正的事件处理函数,而函数防抖只是在最后一次事件后才触发一次函数。比如在页面的无限加载场景下,我们需要用户在滚动页面时,每隔一段时间发一次 Ajax 请求,而不是在用户停下滚动页面操作时才去请求数据。这样的场景,就适合用节流技术来实现。

我在项目中的运用描述: common.js中的函数封装:

// 函数防抖
function throttleFn (callback, wait, timerName) {
  return function () {
    if (window.common[timerName] == null) {
      console.log('首先执行一次');
      callback();
    }
    if (window.common[timerName]) {
      // eslint-disable-next-line new-cap
      Toast({message: '请勿频繁执行', position: 'top'});      
    }
    console.log(window.common[timerName], '===720');
    clearInterval(window.common[timerName]);
    window.common[timerName]  = setTimeout(()=>{
      window.common[timerName]  = null;
    }, wait);
    console.log(window.common[timerName], '=======sojsd');
  };
}

在单页面中的运用:

    handleGraphicChange () {
      window.common.throttleFn(this.handleInitGraphic, 1000, 'imageTImer').apply(this);
    },
收藏
评论区

相关推荐

js的防抖与节流
在进行窗口的resize、scroll,输入框内容校验等操作时,如果事件处理函数调用的频率无限制,会加重浏览器的负担,导致用户体验非常糟糕。 此时我们可以采用debounce(防抖)和throttle(节流)的方式来减少调用频率,同时又不影响实际效果。 函数防抖 函数防抖(debounce):当持续触发事件时,一定时间段内没有再触发事件,事件处理函数才
性能优化之防抖和节流
我的前端学习笔记📒 最近花了点时间把笔记整理到语雀上了,方便童鞋们阅读 我的前端学习笔记📒(https://www.yuque.com/wanggangfeng
防抖和节流
防抖 触发高频事件后n秒内函数只会执行一次,如果n秒内高频事件再次触发,则重新计算事件 思路 每次触发的时候取消之前的延时调用方法,以当下为准 //防抖 function debounce(fn){ let timeout null; return function(){ clearTimeout
浅聊函数防抖与节流
防抖(debounce) 所谓防抖,就是指触发事件后 n 秒后才执行函数,如果在 n 秒内又触发了事件,则会重新计算函数执行时间。 防抖类型分为 1. 非立即执行版 2. 立即执行版 3. 合成版本 防抖 防抖应用场景 登录、发短信等按钮避免用户点击太快,以致于发送了多次请求 调整浏览器窗口大小时,resize 次数过于频繁,造成计算过多,此时需要一次到
记录 30 seconds of code 项目个人觉得中有价值的片段或者小技巧(二)
D F 系列 1、防抖函数,限制高频触发jsconst debounce (fn, ms 0) let timeoutId; return function(...args) clearTimeout(timeoutId); timeoutId setTimeout(() fn.apply(this, args), ms);
JS判断页面被拉到最底部时
### 整个页面被拉到最底部时执行 $(window).scroll(function () { var c=$(window).height(); var a=$("body").scrollTop() var b=$("body").heigh
2020下半年美妆行业
一、抖音短视频美妆电商分析 ### 美容护肤、精致彩妆品类在抖音短视频中较为热销 2020下半年抖音短视频热销Top 1000商品中,美容护肤、精致彩妆类商品的数量占比跻身前四,仅次于食品饮料、日用百货 ![](https://oscimg.oschina.net/oscnet/b7e6208f-17ca-4fab-a768-dd140566f9f
2020年前端开发面试必考:什么是前端防抖?
防抖(去抖),以及节流(分流)在日常开发中可能用的不多,但在特定场景,却十分有用。 ![](https://oscimg.oschina.net/oscnet/dc9ed2e6-56be-427d-8f33-24e57538aa13.png) 最近有同学遇到了要做防抖的需求,那今天李老师就来讲解一下,什么是防抖。为了方便查阅和让不了解防抖
2020年前端开发面试必考:什么是前端防抖?
防抖(去抖),以及节流(分流)在日常开发中可能用的不多,但在特定场景,却十分有用。 ![](https://oscimg.oschina.net/oscnet/dc9ed2e6-56be-427d-8f33-24e57538aa13.png) 最近有同学遇到了要做防抖的需求,那今天李老师就来讲解一下,什么是防抖。为了方便查阅和让不了解防抖
Hbuilder 云端打包app微信分享功能源码示例
<script type="text/javascript"> mui('.mui-scroll-wrapper').scroll({ indicators: true //是否显示滚动条 }); var shares = null; mui.plusReady(function() { var article\_id = plus.webvie
SVG Loading
一、SVG Loading <div style="width:40px;height: 40px;background: #eee;"> <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100" preserveAspectRatio="xMidYMid" clas
SVG Loading
一、SVG Loading <div style="width:40px;height: 40px;background: #eee;"> <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100" preserveAspectRatio="xMidYMid" clas
SwipeRefreshLayout下拉刷新冲突解决
使用SwipeRefreshLayout,网上资料copy了一个OnScrollListener给ListView, 结果当第一个item长度超过一屏,明明还没有到达列表顶部,Scroll事件就被拦截,列表无法滚动,同时启动了刷新。 修正代码后,自定义的OnScrollListener如下: /** 由于Listview与下拉刷新的Scroll
springmvc 静态文件访问
**// 配置静态文件访问路径,防止被拦截器拦截 注:\*\*表示匹配该路径下的所有路径** <**mvc****:annotation-driven** /> <**mvc****:resources** **location****\="/WEB-INF/static/js/"** **mapping****\="/js/\*\*"**/>
抖音推广怎么赚钱 这篇攻略请收好
抖音促销。赚钱是真的吗?如何在中赚钱?在抖音,什么推广能赚钱?下面,我们来详细介绍一下抖音小游戏推广赚钱的方法。想通过抖音赚钱的朋友可以知道。什么是抖音迷你游戏推广?抖音迷你游戏推广意味着抖音在平台上,人们可以发布指定的游戏内容,然后就可以获得利润。利润可以实时查看,人们可以用钱包赚钱。在抖音APP中,搜索“游戏达人推广”,即可进入推广平台(小程序)查看详细