美文网首页
页面性能优化----节流(throttling),防抖(debo

页面性能优化----节流(throttling),防抖(debo

作者: 路尔轩 | 来源:发表于2019-07-15 14:57 被阅读0次

    节流(throttling),防抖(debounce)都是优化高频率触发执行js代码的一种手段

    在前端开发中有一部分的用户行为会频繁的触发事件执行,而对于DOM操作、资源加载等耗费性能的出来很可能导致页面卡顿甚至浏览器的崩溃。

    1、节流----规定的时间内,多次触发事件,js方法只执行一次,稀释了执行次数。

    初始页面,简单的点击增加的效果

    <!DOCTYPE html>
    <html>
        <head>
            <meta charset="UTF-8">
            <title>throttling 节流</title>
        </head>
        <body>
            <div id="show">0</div>
            <button id="btn">click</button>
            <script type="text/javascript">
                var oDiv = document.getElementById("show");
                var oBtn = document.getElementById("btn");
                oBtn.onclick = function(){
                    oDiv.innerHTML = parseInt(oDiv.innerHTML) + 1;
                }
            </script>
        </body>
    </html>
    

    节流操作

    <script type="text/javascript">
        var oDiv = document.getElementById("show");
        var oBtn = document.getElementById("btn");
        function throttle(handler, wait){    // handler--要执行的操作,wait--执行的事件间隔
            var lastTime = 0;
            return function(e){
                var nowTime = new Date().getTime();
                if(nowTime - lastTime > wait){
                    handler.apply(this, arguments);
                    lastTime = nowTime;
                }
            }
        }
        function handleClick(e){
            oDiv.innerHTML = parseInt(oDiv.innerHTML) + 1;
        }
        oBtn.onclick = throttle(handleClick, 1000);
    </script>
    

    2、防抖----上次触发事件和这次触发之间满足一定的空闲时间,js方法才执行一次。
    原始页面,模拟搜索

    <!DOCTYPE html>
    <html>
        <head>
            <meta charset="UTF-8">
            <title>debounce 防抖</title>
        </head>
        <body>
            <input type="text" id="inp" />
            <script type="text/javascript">
                var oInp = document.getElementById('inp');
                function ajax(){
                    // 这里是搜索操作
                    console.log(this.value);
                }
                oInp.oninput = ajax;
            </script>
        </body>
    </html>
    

    防抖操作

    <script type="text/javascript">
        var oInp = document.getElementById('inp');
        var timer = null;
        function ajax(){
            // 这里是搜索操作
            console.log(this.value);
        }
        oInp.oninput = function(){
            var _self = this,_arg = arguments;
            clearTimeout(timer);
            timer = setTimeout(function(){
                ajax.apply(_self, _arg);
            },1000)
        };
    </script>
    

    应用场景:

    类型 场景
    函数防抖 1. 手机号、邮箱输入检测
    2. 搜索框搜索输入(只需最后一次输入完后,再放松Ajax请求)
    3. 窗口大小resize(只需窗口调整完成后,计算窗口大小,防止重复渲染)
    4.滚动事件scroll(只需执行触发的最后一次滚动事件的处理程序)
    5. 文本输入的验证(连续输入文字后发送 AJAX 请求进行验证,(停止输入后)验证一次就好
    函数节流 1. DOM元素的拖拽功能实现(mousemove)
    2. 射击游戏的 mousedown/keydown 事件(单位时间只能发射一颗子弹)
    3. 计算鼠标移动的距离(mousemove)
    4. 搜索联想(keyup)
    5. 滚动事件scroll,(只要页面滚动就会间隔一段时间判断一次)

    相关文章

      网友评论

          本文标题:页面性能优化----节流(throttling),防抖(debo

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