美文网首页
防抖与节流

防抖与节流

作者: 奔跑的兔子_ | 来源:发表于2019-08-21 15:39 被阅读0次

    防抖

    原理:在事件被触发n秒后再执行回调,如果在这n秒内又被触发,则重新计时,最后一次有效。
    适用场景:

    • 按钮提交场景:防止多次提交按钮,只执行最后提交的一次
    • 服务端验证场景:表单验证需要服务端配合,只执行一段连续的输入事件的最后一次,还有搜索联想词功能类似
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <meta http-equiv="X-UA-Compatible" content="ie=edge">
        <title>Document</title>
        <style>
            #iii,
            #jjj {
                height: 100px;
                width: 200px;
                background: lightblue;
                margin-bottom: 10px;
            }
        </style>
    </head>
    <body>
        <div id="jjj">防抖</div>
    </body>
    <script>
        // 防抖
        function debounce(fn, wait) {
            let timeout = null;
            return function () {
                if (timeout !== null) clearTimeout(timeout);
                timeout = setTimeout(fn, wait);
            }
        }
        // 处理函数
        function handle() {
            console.log(Math.random());
        }
        var jjj = document.getElementById('jjj');
        jjj.onclick = debounce.call(this, handle, 1000);
    </script>
    </html>
    

    节流

    解决问题:防止在单位时间内多次触发。例如拖拽
    原理:规定在一个单位时间内,只能触发一次函数。如果这个单位时间内触发多次函数,只有一次生效。

    <!DOCTYPE html>
    <html lang="en">
    
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <meta http-equiv="X-UA-Compatible" content="ie=edge">
        <title>Document</title>
        <style>
            body {
                height: 100000px;
            }
        </style>
    </head>
    
    <body>
        打开控制台,滚动屏幕
    </body>
    <script>
        const throttle = (fn, delay = 500) => {
            let flag = true;
            return (...args) => {
                if (!flag) return;
                flag = false;
                setTimeout(() => {
                    fn.apply(this, args);
                    flag = true;
                }, delay);
            };
        };
        // 处理函数
        function handle() {
            console.log(Math.random());
        }
        window.addEventListener('scroll', throttle(handle, 1000));
    </script>
    
    </html>
    

    适用场景:

    • 拖拽场景:固定时间内只执行一次,防止超高频次触发位置变动
    • 缩放场景:监控浏览器resize
    • 动画场景:避免短时间内多次触发动画引起性能问题

    相关文章

      网友评论

          本文标题:防抖与节流

          本文链接:https://www.haomeiwen.com/subject/loxisctx.html