1. 程式人生 > 實用技巧 >前端關於防抖和節流

前端關於防抖和節流

防抖

使用者短時間內觸發相同的網路請求, 我們限制請求次數, 減輕伺服器之間的壓力, 就叫防抖

舉例來說: 某購物商城上面搜尋框的智慧提示, 使用者輸入東西之後, 會很快向伺服器傳送請求, 如果監聽input事件而不做防抖操作,傳送請求頻率就會很頻繁, 從而造成伺服器壓力過大

<!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>防抖</title>
</head>

<body>
    <input type="text" id="ipt">

    <script>
        const ipt 
= document.querySelector("#ipt"); ipt.addEventListener("input", ev => { debunceAjax(ev.target.value); }) function ajax(val) { console.log(val); } let debunceAjax = debunce(ajax) function debunce(cb) { return function
(val) { clearTimeout(cb.timer); cb.timer = setTimeout(() => { cb(val) }, 1000) } } </script> </body> </html>

防抖的核心是通過定時器來新增延遲, 從而延遲 網路請求的呼叫, 當用戶短時間再次觸發的時候 , 先清除該定時器 , 定時器如果時間沒到 , 裡面的網路請求就不會發送出去 , 隨著清除定時器 一起釋放了 , 網路請求自然就減少了

節流

所謂的節流, 主要是遊戲用的多, 例如 英雄聯盟 平A補刀, 假設使用者點 A 就會發送請求, 那麼, 只要這個人手速夠快, 一秒鐘點個十來次A, 英雄是否就會A 10刀呢? 其實不然, 無論該使用者點選 A 多頻繁, 英雄都只會在一定間隔內攻擊一次, 這就是節流操作

在相同的事件內, 當前事件觸發後, 使用者再次觸發該事件, 就會失效, 直到設定的節流時間 過 , 使用者才能再次觸發該事件

<!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>
</head>

<body>
    <button id="btn">節流使用</button>

    <script>
        const btn = document.querySelector("#btn");
        btn.onclick = () => {
            fnAjax()
        }

        const ajax = () => {
            console.log("123")
        }

        const fnAjax = fn(ajax, 2000)


        function fn(cb, delay) {
            cb.flag = true
            return function () {
                if (cb.flag) {
                    cb.flag = false;
                    setTimeout(() => {
                        cb()
                        cb.flag = true
                    }, delay)
                }
            }
        }


    </script>
</body>

</html>

節流的核心, 同樣是通過定時器, 來延遲傳送網路請求的時間 , 和 防抖 的區別在於, 節流是通過 變數的布林值 來控制 請求的時間間隔