關(guān)于防抖與節(jié)流的應用方案


防抖:一段時間完成一個操作;節(jié)流:定時完成操作。
應用場景:

防抖:
1、seach搜索聯(lián)想,用戶在不斷輸入輸入值時,用防抖來節(jié)約請求資源。
2、windows觸發(fā)resize的時候,不斷的調(diào)整瀏覽器窗口大小會不斷的觸發(fā)這個事件,用防抖來讓其只觸發(fā)這一次。
3、防止重復提交。
節(jié)流:
1、鼠標不斷點擊觸發(fā),mousedown(單位時間內(nèi)只觸發(fā)一次)。
2、監(jiān)聽滾動事件,比如是否滑到底部自動加載更多,用throttle。

    <!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>防抖與節(jié)流</title>
        <style>
            .container{width: 400px;height: 200px;background: #ccc;text-align: center;font-size: 25px;line-height: 200px;}
        </style>
    </head>
    <body>
        <div class="container"></div>
    </body>
    <script>
    var count=1;
    var container=document.querySelector(".container");
    function getUser() {
        this.innerHTML= count++;
    }
    // container.onmousemove=demo(getUser,1000,true);//防抖
    container.onmousemove = time(getUser, 1000);//節(jié)流
// *****************************************************************
//防抖
    function demo(fn,wait,buber) {
        var timer;
        return function () {
            clearTimeout(timer);
            if(buber){
                var callNow=!timer;
                timer=window.setTimeout(function () {
                    timer=null
                },wait);
                if(callNow){
                    fn.apply(this);
                }
            }
            else{
                clearTimeout(timer);
                timer = window.setTimeout(fn.bind(this), wait);
            }
        }
    }
// 節(jié)流
    function time(fn,wait){
        var pp=0;//參照物
        return function () {
            var now= + new Date();//1970 1 1 到現(xiàn)在的毫秒數(shù)
            if(now-pp>wait){
                fn.apply(this);
                pp=now
            }
        }
    }
    </script>
    </html>

作者:Vam的金豆之路

主要領域:前端開發(fā)

我的微信:maomin9761

微信公眾號:前端歷劫之路