关于节流与防抖

111 阅读1分钟

首先来说防抖,防抖最主要用于input搜索框,切框内注册的是input事件


<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>

    <input type="text" placeholder="请输入文本">

\


    <script>

        /*

        1.函数防抖 : 单位时间内频繁触发事件, 只会触发‘最后一次’

        2.防抖场景 : 输入框输入事件 oninput

        3.防抖流程 :

            (1)声明全局变量存储定时器ID

            (2)每一次触发事件的时候,先清除上一次定时器

            (3)开启本次 防抖定时器

        PS : 只要用户在单位时间内触发事件,之前的事件定时器就会被清除。只有当用户在单位事件不触发事件,等待定时器到事件自动执行。这样就实现了单位事件永远只会触发最后一次事件效果。

        */

\


        //(1)声明全局变量存储定时器ID

        let timeID = null

\


        document.querySelector('input').addEventListener('input',function(){

            //(2)每一次触发事件的时候,先清除上一次定时器

            clearTimeout(timeID)

            //(3)开启本次 防抖定时器

            /*

            定时器中function : 指向window

            箭头函数 : 没有this,访问上级this, 指向事件源

            */

            timeID = setTimeout( ()=>{

                console.log(`发送ajax请求:${this.value}`)

            } , 300 )

           

        })

\


       

    </script>

</body>

</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 {

            width: 3000px;

            height: 3000px;

        }

    </style>

</head>

\


<body>

\
\


    <script>

        /*

       

        1.函数节流 : 单位时间内频繁触发事件,只会‘触发一次’

       

        2.节流场景 : 解决事件高频触发。  滚动条事件、鼠标移动

        3.节流思路 :

            (1)声明一个全局开关  let flag = true

            (2)触发事件的时候,判断开关。

                如果是true : 触发事件,把开关改为false

                如果是false : 不触发事件

            (3)开启节流定时器,在节流时间之后把开关改为true

           

        */

\
\


        //(1)声明一个全局开关  let flag = true

        let flag = true

\


        let i = 1

        window.onscroll = function () {

            //(2)触发事件的时候,判断开关。

            if (flag) {

                //触发事件,把开关改为false

                flag = false

                console.log(`滚动事件触发次数:${i++}`)

                //(3)开启节流定时器,在节流时间之后把开关改为true

                setTimeout(function () {

                    flag = true

                }, 300)

            }

\


        }

\


        // let j = 1

        // window.onmousemove = function(){

        //     console.log(`鼠标移动事件触发次数:${j++}`)

        // }

\


    </script>

</body>

\


</html>