• 前端处理防抖和节流


    防抖(debounce):当持续触发事件时,保证只执行最后一次事件处理函数

    在给DOM绑定事件时,有些事件我们是无法控制触发频率的。
     如鼠标移动事件onmousemove, 滚动滚动条事件onscroll,
    窗口大小改变事件onresize,瞬间的操作都会导致这些事件会被高频触发。
     如果事件的回调函数较为复杂,就会导致响应跟不上触发,出现页面卡顿,假死现象。 
    在实时检查输入时,如果我们绑定onkeyup事件发请求去服务端检查,用户输入过程中,事件的触发频率也会很高,
    会导致大量的请求发出,响应速度会大大跟不上触发。

    如何实现防抖呢?

    我们拿滚动事件举例子,用户的滚动会频繁触发滚动事件,很容易造成页面卡死。那么我们可以封装如下一个函数。

    每次想调用函数的时候,设置一个定时器让函数延迟执行。

    当连续触发的时候,前面每次定时器都会清除掉,都会停掉前面的定时器所以函数并不会运行,只会执行最后一次。

    // 防抖
    
    function debounce(fn) {
        let timeout = null; // 创建一个标记用来存放定时器的返回值
        return function () {
            clearTimeout(timeout); // 每当用户输入的时候把前一个 setTimeout clear 掉
            timeout = setTimeout(() => { // 然后又创建一个新的 setTimeout, 这样就能保证输入字符后的 interval 间隔内如果还有字符输入的话,就不会执行 fn 函数
                fn()
            }, 500);
        };
    }
    function sayHi() {
        console.log('防抖成功');
    }
    let box = document.getElementById('box')
    box.addEventListener('click', debounce(sayHi))

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

    如何实现节流?
    当用户连续操作的时候,我们设置一个定时器,一段时间后执行函数,并且执行完把标记改为true,所以在函数没有执行完之前一直是false,

    可能有的同学认为连续操作那么函数连续运行,那么canRun这个标记不一直是true吗,

    并不是,注意这里是一个闭包结构,真正每次调用的其实是throttle里面return的函数并不是每次都调用throttle,所以canRun只是提供初始值,并不会每次都重新赋值为true。

    所以用户连续操作的时候,比如用户一秒钟连续操作了十次,但是对于我们这个代码来说,只可能每500毫秒执行一次,因为只有500ms之后canRun才为true,才能开启下一个定时器。

    所以哪怕用户一秒钟之内连续点了十次,其实也只是能执行两次。这就符合节流的本意。

    function throttle(fn) {
        let canRun = true; // 通过闭包保存一个标记
        return function () {
            if (!canRun) return; // 在函数开头判断标记是否为true,不为true则return
            canRun = false; // 立即设置为false
            setTimeout(() => { // 将外部传入的函数的执行放在setTimeout中
                fn()
                // 最后在setTimeout执行完毕后再把标记设置为true(关键)表示可以执行下一次循环了。当定时器没有执行的时候标记永远是false,在开头被return掉
                canRun = true;
            }, 500);
        };
    }
    function sayHi(e) {
        console.log('节流');
    }
    window.addEventListener('resize', throttle(sayHi));

    总结:防抖动和节流本质是不一样的。

    防抖动是将多次执行变为最后一次执行,节流是将多次执行变成每隔一段时间执行。

    文章转载至https://blog.csdn.net/qq_40096030/article/details/114372174

  • 相关阅读:
    A题
    CTF--web BugKu-ctf-web(1-10)
    CTF--web 攻防世界web题 robots backup
    CTF--web 攻防世界web题 get_post
    BUUCTF-Crypyo-No.1
    攻防世界-新手篇(Mise)~~~
    BJDCTF-2020-WRITEUP---TiKi小组
    TKCTF-学校内部的校赛
    BUUCTF-BJD(更新V1.0)
    线程池(1)-参数
  • 原文地址:https://www.cnblogs.com/mlw1814011067/p/14538248.html
Copyright © 2020-2023  润新知