首页 > 其他分享 >节流与防抖

节流与防抖

时间:2022-09-18 21:55:11浏览次数:55  
标签:box 触发 防抖 定时器 节流 function 代码

防抖:在频繁触发事件时,事件只执行一次,并且是最后一次触发的时候

主要思想:给需要触发业务代码加上一个定时器,并且如果在定时器设定的时间内,该业务代码再次被触发,则清除上一次的定时器。

节流:在频繁触发事件时,事件在一定时间间隔内,只执行一次

主要思想:控制执行次数,同样,设置一个定时器,设置间隔时间,设定一个触发业务代码的全局状态,为true时触发事件,只有在执行完定时器中的业务代码时,状态才为true,否则不触发业务代码。

滚动条事件触发案例

当拖动页面滚动条时,触发我们所需要的业务代码,频繁地拖拽导致1秒内事件触发了93次,如果业务代码增多,会导致页面卡顿;如果向后端发ajax,会导致后台服务器压力过大、崩溃等等问题。
在这里插入图片描述
html

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        body {
            height: 2000px
        }
        div {
            height: 200px;
            width: 200px;
            overflow: scroll;
            margin: auto;
            background-color: #333;
        }
    </style>
</head>
<body>
    <div id="box">
        <div style="height: 300px"></div>
    </div>
</body>

js

var box = document.getElementById('box')
    box.onscroll = function() {
        console.log(123)
    }

解决办法:

1、防抖

var box = document.getElementById('box')
box.onscroll = debounce(sayhello, 500)
    function sayhello() {
        console.log(this)
        console.log('hello world')
    }

    // 防抖函数
    function debounce(fn, delay) {
        let timer
        return function() {
            if (timer) {
                clearTimeout(timer)
            }
            timer = setTimeout(() => {
                // 改变this指向
                fn.call(this)
            }, delay)
        }
    }
</script>

2、节流

var box = document.getElementById('box')
box.onscroll = throttle(sayhello, 500)
    // 节流函数
    function throttle(fn, delay) {
        let flag = true
        return function() {
            if (flag) {
                setTimeout(() => {
                    flag = true
                    // 业务代码
                    // 改变this指向
                    // fn.apply(this)
                    fn.call(this)
                }, delay)
            }
            flag = false
        }
    }
    function sayhello() {
        console.log(this)
        console.log('hello world')
    }
</script>

两者封装:采用闭包,

原因:1.需要设置一个全局的变量存放定时器;2.防抖功能代码和业务代码混合在一起,一旦业务代码量增多不易于维护。
两者应用场景:搜索框输入查询,按钮提交事件,浏览器的窗口缩放,浏览器滚动条事件触发

标签:box,触发,防抖,定时器,节流,function,代码
From: https://www.cnblogs.com/ushen/p/16705942.html

相关文章

  • ng zorro Select 异步频繁请求数据进行节流控制
        思路:每次搜索框输入改变,先清除上一次的延时请求,本次请求延时(某种程度上等待用户输入完成后请求数据)......
  • 第 3 题:什么是防抖和节流?有什么区别?如何实现?
    防抖触发高频事件后n秒内函数只会执行一次,如果n秒内高频事件再次被触发,则重新计算时间思路:每次触发事件时都取消之前的延时调用方法functiondebounce(fn)......
  • 前端性能优化-防抖
    防抖:如果短时间内大量触发同一事件,只会执行一次函数,将多次执行变为最后一次执行。防抖函数的应用场景:按钮提交场景:防⽌多次提交按钮,只执⾏最后提交的⼀次服务端验证......
  • 实现防抖和节流,原理介绍+应用场景
    防抖和节流都是为了解决事件被频繁触发的问题防抖(debounce)原理:当持续触发事件时,在设定的时间内没有再次触发事件,则事件才会处理函数一次;如果在设定时间之前再次触......
  • 防抖和节流
    防抖就是在固定事件内连续请求时,只处理最后一次的请求(用定时器解决)将请求过程设定时间,在该时间内重复发送请求会刷新时间。 节流就是在规定时间内,只接受第一次的请求(定......
  • 防抖节流
    防抖节流(重点)浏览器的极限绘制频率60侦,计时器的话大概为16.666高频触发的业务:抽奖登录动画网络加载等等需要//登录防抖functionfangdou(cb,delay){vartimer......
  • js实现防抖节流
    前端项目开发过程中,对一个dom元素动作绑定了事件,但触发dom函数的动作过于频繁从而影响页面性能甚至出现bug的情况,比如:页面滚动scroll事件、浏览器窗口resize事件、输入框......
  • 防抖和节流
    防抖和节流防抖/* 应用场景:当用户进行了某个行为(如点击)之后,不希望每次行为都会触发方法,而是行为做出后,一段事件内没有再次重复行为,才给用户响应. 实现原理:每......
  • 事件节流
    事件节流用于控制事件触发的最小间隔。如一个事件100毫秒内只能触发一次。如窗口缩放过程中对页面的元素大小重新调整,因为resize事件的触发是非常快的,用户虽然在频繁......
  • Java中字节流的总结及代码练习
    Java中的字节流在描述字节流时,先知道什么是流流可以分为:输入流和输出流输入流和输出流示意图:字节流读取内容:二进制,音频,视频优缺点:可以保证视频音频无损,效率低,没有缓......